我了解到,SOCK_DGRAM和SOCK_STREAM对应于使用INET地址家族完成的无连接和面向连接的网络通信。
现在,我正在尝试学习AF_UNIX套接字,以在同一主机上运行的进程之间执行IPC,在那里,我看到我们需要将sub_socket_type指定为SOCK_DGRAM或SOCK_STREAM。对于AF_UNIX套接字,我无法理解,指定子套接字类型的目的是什么。
有人可以帮助了解AF_UNIX套接字上下文中SOCK_DGRAM和SOCK_STREAM的重要性吗?
答案 0 :(得分:4)
碰巧,TCP既是流协议,又是面向连接的,而UDP是数据报协议,并且是无连接的。但是,可能有一个面向连接的数据报协议。那就是块特殊文件(或Windows Mailslot)。
(尽管您不能拥有无连接流协议,除非/dev/null
算在内,否则这没有任何意义)
标志SOCK_DGRAM
并不意味着套接字是无连接的,它意味着套接字是面向数据报的。
面向流的套接字(以及/ dev / random或/ dev / null等字符特殊文件)提供(或使用或同时使用)连续的字节序列,没有固有的结构。通过解释流的内容来提供结构。一般来说,流的两端只有一个进程。
面向数据报的套接字,提供(或使用或同时使用)短消息,这些消息的大小受到限制且是独立的。一般而言,服务器可以使用recvfrom
(为调用方提供一个地址来向其发送回复)从多个客户端接收数据报,并使用sendto
指定该地址来回复它们。
答案 1 :(得分:0)
这个问题也让我有些困惑,但是正如Ben所说,套接字类型是SOCK_STREAM或SOCK_DGRAM,它们都意味着以相同的方式访问客户端和服务器之间的进程间通信。在AF_UNIX域下,它与众不同。