当前位置:  开发笔记 > 编程语言 > 正文

什么时候需要IPPROTO_UDP?

如何解决《什么时候需要IPPROTO_UDP?》经验,为你挑选了2个好方法。

什么时候需要IPPROTO_UDP?

有没有UDP 不是 SOCK_DGRAM的默认协议?(真实案例,不是假设"它可能是",请")

即,以下两行不会产生相同行为的情况是什么?

if ((s=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP))==-1)
if ((s=socket(AF_INET, SOCK_DGRAM, 0))==-1)

小智.. 16

某些操作系统(例如2.6.20之后的Linux内核)支持SOCK_DGRAM的第二个协议,称为UDP-Lite.如果您的系统支持,则可以通过提供IPPROTO_UDPLITE作为socket()调用的第三个参数来启用它.

通过允许校验和仅应用于数据报的一部分,它与普通UDP不同.(通常,UDP校验和是一种全有或全无的努力.)这样,如果校验和区域外的某些片段可能在传输过程中丢失,则协议可以更好地抵抗由于分段传输导致的校验和失败.只要成功接收到覆盖校验和部分的片段,尽可能多的数据报仍将传递给应用程序.

为了向后兼容现有代码,我怀疑(但我不能保证)调用套接字(AF_INET,SOCK_DGRAM,0)将继续默认为普通UDP,即使在另外支持UDP-Lite的系统中也是如此.



1> 小智..:

某些操作系统(例如2.6.20之后的Linux内核)支持SOCK_DGRAM的第二个协议,称为UDP-Lite.如果您的系统支持,则可以通过提供IPPROTO_UDPLITE作为socket()调用的第三个参数来启用它.

通过允许校验和仅应用于数据报的一部分,它与普通UDP不同.(通常,UDP校验和是一种全有或全无的努力.)这样,如果校验和区域外的某些片段可能在传输过程中丢失,则协议可以更好地抵抗由于分段传输导致的校验和失败.只要成功接收到覆盖校验和部分的片段,尽可能多的数据报仍将传递给应用程序.

为了向后兼容现有代码,我怀疑(但我不能保证)调用套接字(AF_INET,SOCK_DGRAM,0)将继续默认为普通UDP,即使在另外支持UDP-Lite的系统中也是如此.



2> Gonzalo..:

鉴于这些声明:

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中的ip(7)手册页说:

协议的唯一有效值是0和TCP套接字的IPPROTO_TCP,以及UDP套接字的0和IPPROTO_UDP.对于SOCK_RAW,您可以指定RFC 1700分配的号码中定义的有效IANA IP协议.

问题中的这两行总会产生相同的结果.

推荐阅读
手机用户2402851155
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有