ノンブロッキング接続を作成したい。このような:
socket.connect(); // returns immediately
これには、別のスレッド、無限ループとLinux epollを使用します。このように(擬似コード):
// in another thread
{
create_non_block_socket();
connect();
epoll_create();
epoll_ctl(); // subscribe socket to all events
while (true)
{
epoll_wait(); // wait a small time(~100 ms)
check_socket(); // check on EPOLLOUT event
}
}
サーバーを実行してからクライアントを実行すると、すべて機能します。最初にクライアントを実行した場合、少し待ってからサーバーを実行すると、クライアントが接続しません。
何が悪いのですか?多分それは別の方法で行うことができますか?
非同期接続には次の手順を使用する必要があります。
socket(..., SOCK_NONBLOCK, ...)
でソケットを作成するconnect(fd, ...)
で接続を開始します0
_でもEINPROGRESS
でもない場合、エラーで中止しますfd
が出力可能として通知されるまで待機しますgetsockopt(fd, SOL_SOCKET, SO_ERROR, ...)
でソケットのステータスをチェックしますループなし-EINTR
を処理する場合を除きます。
クライアントが最初に起動された場合、最後のステップでエラーECONNREFUSED
が表示されます。この場合は、ソケットを閉じて、最初からやり直してください。
詳細を確認しないと、コードのどこに問題があるのかを知ることは困難です。 _check_socket
_オペレーションでエラーが発生しても中止しないと思います。
ノンブロッキング接続が成功するかどうかをテストする方法はいくつかあります。
参照:UNIXネットワークプログラミングV1