2005 年 12 月 28 日 22 時 40 分

とりあえず動作


このアーカイブは同期化されません。 mixi の日記が更新されても、このアーカイブには反映されません。


今日はプロキシとしての実装を行う。
クライアントから接続があった場合、
代行してサーバに接続する。

    auto_ptr<Socket> client(listener->Accept());

    sockaddr_in sa;
    memset(&addr, 0, sizeof(sockaddr_in));
    sa.sin_family = AF_INET;
    sa.sin_port = htons(21);
    sa.sin_addr.s_addr = inet_addr("192.168.0.77");

    auto_ptr<Socket> server(new Socket(AF_INET, SOCK_STREAM, 0));
    server->Connect(sa);

通信の始まり~始まり~。
まずはバッファとか準備。

    char buffer[256] = { '\0' };
    int  size = 0;
    Socket *sockets[2] = { client.get(), server.get() };

クライアントかサーバかどちらかが通信してくるはず。
WaitAny で二つの通信を監視し、
クライアントからの通信をサーバへ、
サーバからの返信をクライアントへ転送する。

    do {
        // WaitAny は select のラッパ
        int index = Socket::WaitAny(TransmissionDirection::Incoming, sockets, 2);
        switch (index) {
        case 0: // client
            size = client->Read(buffer, 256);
            if (size == 0) break;
            server->Send(buffer, size);
            break;
        case 1: // server
            size = server->Read(buffer, 256);
            if (size == 0) break;
            client->Send(buffer, size);
            break;
        }
    } while (size != 0);

テストっと。問題なくつながった。
これで、クライアントから見れば
直接サーバとつないでるのとほとんど変わらない。

ロジックを仕込んでないので、
データ通信ができないのは変わらないけど、
今のところいい感じかも。



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