我需要使用Unix域套接字构建一个服务器,看起来有几个选项可以选择通信类型。
来自man 2套接字
:
- SOCK_STREAM
- SOCK_DGRAM
- SOCK_SEQPACKET
那么,什么更适合他们每个人呢? (流、数据报、数据包)
最佳答案
这实际上取决于您要实现哪种类型的服务器。
如果消息边界很重要,那么SOCK_DGRAM
将是最佳选择。
因为recvfrom/recvmsg/select
会在收到完整消息时返回。
使用SOCK_STREAM
,消息接收更加棘手:一个接收调用可能返回部分消息,或者两条消息的一部分,或者多条消息......等等。
如果消息边界不重要,那么 SOCK_STREAM
可能是最佳选择。
AF_INET
的 SOCK_DGRAM
是不可靠的 UDP。但是,在大多数系统中,AF_UNIX
的SOCK_DGRAM
是可靠的。
例如:如果接收方队列已满,发送方将被阻塞,直到有空间为止。
关于sockets - 什么更适合 Unix 套接字中的每种类型的通信?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11700456/