1
#include <sys/socket.h>
int main() {
    int s[2];
    socketpair(AF_UNIX, SOCK_STREAM, 0, s);

    close(s[1]);
    char buf;
    read(s[0], &buf, 1);
}

終了しますが、SOCK_DGRAMを使用するとハングします。

メッセージがなくなる時期を確認するにはどうすればよいですか?ピアFDが閉じているときに、「読み取り」がECONNRESETのようなものを返さないのはなぜですか。

4

1 に答える 1

3

SOCK_DGRAMとSOCK_STREAMの違いは、前者はコネクションレス型であるということです。つまり、特に、通信の反対側に通信される接続「状態」がありません。したがって、そのソケットが反対側で閉じられるという概念はありません。リスニングサーバーには、データグラムを受信できる有効なエンドポイントがまだありますが、この場合は匿名であるため、他の誰もそれを見つけて送信することはできません。

接続状態情報が必要な場合は、SOCK_STREAMを使用します。

たとえば、非常によく似た問題について説明しているこのスレッドを参照してください。

于 2013-03-18T22:25:55.573 に答える