何时需要IPPROTO_UDP?
何时需要IPPROTO_UDP 是否存在UDP不是SOCK_DGRAM的默认协议的情况?(请提供真实案例,而不是假设的“可能是”) i、 例如,在什么情况下,以下两条线不会产生相同的行为何时需要IPPROTO_UDP?,udp,sockets,Udp,Sockets,何时需要IPPROTO_UDP 是否存在UDP不是SOCK_DGRAM的默认协议的情况?(请提供真实案例,而不是假设的“可能是”) i、 例如,在什么情况下,以下两条线不会产生相同的行为 if ((s=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP))==-1) if ((s=socket(AF_INET, SOCK_DGRAM, 0))==-1) 鉴于这些声明: tcp_socket = socket(AF_INET, SOCK_STREAM, 0); udp
if ((s=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP))==-1)
if ((s=socket(AF_INET, SOCK_DGRAM, 0))==-1)
鉴于这些声明:
tcp_socket = socket(AF_INET, SOCK_STREAM, 0);
udp_socket = socket(AF_INET, SOCK_DGRAM, 0);
raw_socket = socket(AF_INET, SOCK_RAW, protocol);
linux中的手册页面显示:
协议的唯一有效值是
0和IPPROTO_TCP用于TCP套接字,以及
0和IPPROTO_UDP用于UDP套接字。
对于SOCK_RAW,您可以指定有效的
RFC 1700中定义的IANA IP协议
分配的号码
问题中的这两行始终会产生相同的结果。某些操作系统(如2.6.20之后的Linux内核)支持SOCK_DGRAM的第二个协议,称为UDP Lite。如果您的系统支持,则可以通过提供IPPROTO_UDPLITE作为socket()调用的第三个参数来启用它
它与普通UDP的区别在于只允许对数据报的一部分应用校验和(通常,UDP校验和是全有或全无的)这样,当校验和区域外的某些片段在传输过程中丢失时,协议可以更好地抵抗由于碎片传输而导致的校验和失败。只要覆盖校验和部分的片段成功接收,尽可能多的数据报仍将发送给ap折叠
为了向后兼容现有代码,我怀疑(但我不能保证)调用套接字(AF_INET,SOCK_DGRAM,0)将继续默认为正常UDP,即使在另外支持UDP Lite的系统中也是如此。我认为使用
IPPROTO_UDP
intsead为零与获得需要填充所有标头的套接字的结果不同。