我在查找有关 socket
的第三个参数的这些设置之间的区别的文档时遇到了一些麻烦。是。我知道 TCP 和 UDP 及其差异,而且 IP 是堆栈上的一层(下?)...无论我将其设置为 IPPROTO_IP
,我的 UDP 代码似乎都一样工作。或 IPPROTO_UDP
.
最佳答案
socket()
的文档在 Linux 上分为不同的联机帮助页,包括 ip(7)
指定您必须使用 0
或 IPPROTO_UDP
对于 UDP 和 0
或 IPPROTO_TCP
用于 TCP。当您使用 0
,恰好是 IPPROTO_IP
的值, UDP 用于 SOCK_DGRAM
TCP 用于 SOCK_STREAM
.
在我看来,创建 UDP 或 TCP IPv4 套接字对象的干净方法如下:
int sock_udp = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
int sock_tcp = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
原因是通常显式比隐式更好。在这种特定情况下,使用
0
或更糟IPPROTO_IP
因为第三个论点对你没有任何好处。还可以想象使用可以同时处理流和数据报的协议(protocol),如 sctp。通过始终指定 socktype 和协议(protocol),您可以避免任何歧义。
关于sockets - IPPROTO_IP 与 IPPROTO_TCP/IPPROTO_UDP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5385312/