2006 年 1 月 7 日 21 時 10 分

データ通信部の実装


このアーカイブは同期化されません。 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 って感じの関数でさっと実装。

テストは明日にしよう。



Copyright (c) 1994-2007 Project Loafer. All rights reserved.