0

ソケットプログラミングで、接続が閉じられた場合、Unix スレッドはどのようにしてクライアントからソケット CLOSE イベントを受け取りますか?

受信した CLOSE イベントについて UNIX スレッドに通知する API はありますか?

Windows と同様に、指定されたソケット記述子のイベント通知を取得する WSAEnumNetworkEvents API があります。Unix ソケット プログラミングで使用される同等の API は何ですか?

クエリのヘルプを提供してください。

4

4 に答える 4

2

読み取りを実行するときに、閉鎖イベントを追跡できます。0を返すと、ソケットは閉じられreadます (もちろん、「バークレー ソケット」について話します)。

//編集: pollorselectを使用して、何らかのイベントが発生するのを待ちます (データの到着、ソケットの閉鎖など)。

于 2010-06-15T04:48:03.060 に答える
0

libeventを使用すると、ソケットにデータがある場合、またはソケットを閉じる必要がある場合にイベントを受け取ることができます。より具体的には、読み取りイベント (EV_READ) で通知するようにソケットをセットアップし、関数コールバックで、recv からの戻り値が 0 (相手側のソケットが正常にシャットダウンしたことを示す) であるか、または -1 であるかを確認します。エラー。戻り値が 0 である最初のケースでは、ソケットを閉じたいと考えています。-1 の戻り値が何らかの「エラー」を示す 2 番目のケースでは、何を行うかはエラーの性質によって異なります。たとえば、recv は -1 を返し、errno を EINTR に設定して、たとえば SIGUSR1 割り込みによって関数が中断されたことを示します。それをどのように処理するかは、アプリケーションで何をする必要があるかによって異なります。

于 2010-06-15T07:01:13.110 に答える
0

boost::asioの使用について考えましたか。この方法で、少なくとも Linux と Windows の間でコードを共有できます。裸のソケットに比べてオーバーヘッドはそれほど大きくなく、セマンティクスが優れているという利点があります。ブーストからのコードの多くの部分が標準の C++ に流れたので、コードはかなり高品質です。

これには、オプションではない可能性のあるソフトウェアの書き直しが含まれます。一方、維持する共通のコードベースがあります。

于 2010-06-15T04:48:11.417 に答える
0

申し訳ありませんが、回答する時間がありませんが、Beej's Guide to Network Programming をご覧ください。

于 2010-06-15T04:44:13.140 に答える