2013-03-18 66 views
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它掛起。如何知道sockatpair的SOCK_DGRAM對等套接字何時關閉?

如何找出何時不再有消息?爲什麼「read」在對等FD關閉時不會返回類似ECONNRESET的內容?

回答

3

SOCK_DGRAM和SOCK_STREAM之間的區別在於前者是無連接的,這意味着除了別的以外,沒有連接通信的另一端的連接「狀態」。因此,這個插座沒有被另一端封閉的概念。監聽服務器仍然有一個有效的端點可以接收數據報,即使在這種情況下它恰好是匿名的,因此沒有其他人可以找到它來發送數據報。

如果你想擁有連接狀態信息,你想使用SOCK_STREAM。

參見例如this thread,其討論了非常類似的問題。 OK。

+0

OK。我可以用SOCK_SEQPACKET替換SOCK_DGRAM,並假設它將支持SOCK_SEQPACKED嗎? – 2013-03-18 22:41:37

+0

我沒有親自使用過SOCK_SEQPACKET,但是是的,這似乎是它的目的,它聽起來像它應該工作的線程。 – rra 2013-03-19 00:36:22