3

私は現在、初めて BSD ソケットをラップしており、途中で結果の単体テストも行っています。とにかく、ローカルホストアドレスの再利用に関連する Acceptor クラスと TcpSocket クラスをテストする簡単なテストを書いているときに問題に遭遇しました。

擬似コード:

//server thread
{
    //binds, listens and accepts on port 50716 on localhost
    TcpAcceptor acceptor(Resolver::fromService("50716"));
    //i get a ECONNREFUSED error inside the accept function when trying to create newSock
    TcpSocket newSock = acceptor.accept();
}

//connect in the main thread
TcpSocket connectionSocket(Resolver::resolve(Resolver::Query("localhost", "50716")));

同じホスト/ポートでリッスンして接続することさえ可能ですか? 同じマシン/ホストで簡単なクライアント/サーバー テストを実行する方法はありますか?

ありがとう!

編集:

クール、物事は今動作します!参考までに、ブロッキングソケットを使用して簡単なテストを実行したとしても、次のようにリッスンを受け入れから切り離すと、スレッドを使用する必要さえないことにもプロセスで気付きました。

//server socket
TcpAcceptor acceptor;
acceptor.bind(Resolver::fromService("0"));
acceptor.listen();

//client socket, blocks until connection is established
TcpSocket clientSock(SocketAddress("127.0.0.1", acceptor.address().port()));

//accept the connection, blocks until one accept is done
TcpSocket connectionSock = acceptor.accept();

//send a test message to the client
size_t numBytesSent = connectionSock.send(ByteArray("Hello World!"));

//read the message on the client socket
ByteArray msg(12);
size_t bytesReceived = clientSock.receive(msg);
std::cout<<"Num Bytes received: "<<bytesReceived<<std::endl;
std::cout<<"Message: "<<msg<<std::endl;

このようにテストを構築すると、ブロッキング関数に対しても、素晴らしくシンプルなテスト ケースが可能になります。

4

1 に答える 1

4

はい、可能です。サーバーとクライアントが異なるプロセスでなければならないという制限はありません。1 つのスレッドがソケットをオープン/リッスンし、他のスレッドがソケットに接続できます。

于 2012-05-09T14:38:28.037 に答える