このアーカイブは同期化されません。 mixi の日記が更新されても、このアーカイブには反映されません。
方針も決まったことだし、実装に行こう。
まずはサクっとデータ待機スレッドを実装する。
これは前に作ったコントロール待機スレッドと変わらない。
Socket を作成して Bind, Listen、
auto_ptr<Socket> listener(new Socket(AF_INET, SOCK_STREAM));
listener->Bind(localAddr);
listener->Listen(2);
ループで通信を待機し、クライアントからの接続が来たら、
データ通信スレッドを作成する。
if (listener->Wait(Incoming, 1000)) {
auto_ptr<DataSession> session(new DataSession(listerner.get(), serverAddr));
session->Start();
}
通信スレッドは Accept して対クライアントソケットを取得。
次いで サーバに接続する対サーバソケットを作成。
auto_ptr<Socket> client(listener->Accept());
auto_ptr<Socket> server(new Socket(AF_INET, SOCK_STREAM));
server->Connect(serverAddr);
後は受け取った 2 つのソケットの通信を媒介するだけ。
通常、データの流れる方向は 1 方向だけになるので、
単純に WaitAny を使って実装するか。(select のラッパ)
これは 12/28 に書いたので省略。
また、データ待機スレッドクラスのコンストラクタと
デストラクタを使って、UPnPNT の登録、解除も行う。
UPnPNT はラッパを書いてクラス化したいところだが、
COM なので今は無視しようか。スレッド処理が面倒だ。
(Un)RegisterPortMapping って感じの関数でさっと実装。
テストは明日にしよう。