Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
何时需要IPPROTO_UDP?_Udp_Sockets - Fatal编程技术网

何时需要IPPROTO_UDP?

何时需要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

何时需要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_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为零与获得需要填充所有标头的套接字的结果不同。