我需要使用 Unix 域套接字构建一个服务器,看起来有几个选项可以选择通信类型。来自man 2 socket
:
- SOCK_STREAM
- SOCK_DGRAM
- SOCK_SEQPACKET
那么,什么更适合他们每个人呢?(流、数据报、数据包)
我需要使用 Unix 域套接字构建一个服务器,看起来有几个选项可以选择通信类型。来自man 2 socket
:
那么,什么更适合他们每个人呢?(流、数据报、数据包)
这真的取决于你要实现什么样的服务器。
如果消息边界很重要,那么SOCK_DGRAM
将是最佳选择。因为recvfrom/recvmsg/select
将在收到完整消息时返回。
使用SOCK_STREAM
,消息接收更加棘手:一个接收调用可能返回部分消息,或两条消息的一部分,或多条消息......等。
如果消息边界不重要,那么SOCK_STREAM
可能是最佳选择。
SOCK_DGRAM
ofAF_INET
是不可靠的 UDP。但是,在大多数系统中,SOCK_DGRAM
ofAF_UNIX
是可靠的。例如:如果接收者队列已满,则发送者将被阻塞,直到有空间为止。
对于 TCP -> SOCK_STREAM 对于 UDP -> SOCK_DGRAM