Linux:socketpair()和socket()有什么区别?


回答 1:

Unix套接字就像双向FIFO。 但是,所有数据通信将通过套接字接口而不是通过文件接口进行。 尽管Unix套接字是文件系统中的一个特殊文件(就像FIFO),但是您将不会使用open()和read()-您将使用socket(),bind(),recv()等。

例如,在描述您要使用的Unix套接字(即指向该套接字的特殊文件的路径)时,可以使用struct sockaddr_un

struct sockaddr_un {unsigned short sun_family; / * AF_UNIX * / char sun_path [108];}

这是将传递给bind()函数的结构,该函数将套接字描述符(文件描述符)与某个文件(名称在sun_path字段中)相关联。

套接字对是普通的AF_UNIX套接字,这意味着可以通过它们传递辅助消息,例如SCM_RIGHTS和SCM_CREDENTIALS。

如果要使用pipe(),但想使用单个管道从双方发送和接收数据? 由于管道是单向的(SYSV中有例外),所以您不能这样做! 但是,有一个解决方案:使用Unix域套接字,因为它们可以处理双向数据。

有一个系统调用,叫做socketpair(),它足以返回一对已经连接的套接字

如果(socketpair(AF_UNIX,SOCK_STREAM,0,sv)== -1){perror(“ socketpair”); 出口(1); }