什么时候需要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的系统中也是如此.
某些操作系统(例如2.6.20之后的Linux内核)支持SOCK_DGRAM的第二个协议,称为UDP-Lite.如果您的系统支持,则可以通过提供IPPROTO_UDPLITE作为socket()调用的第三个参数来启用它.
通过允许校验和仅应用于数据报的一部分,它与普通UDP不同.(通常,UDP校验和是一种全有或全无的努力.)这样,如果校验和区域外的某些片段可能在传输过程中丢失,则协议可以更好地抵抗由于分段传输导致的校验和失败.只要成功接收到覆盖校验和部分的片段,尽可能多的数据报仍将传递给应用程序.
为了向后兼容现有代码,我怀疑(但我不能保证)调用套接字(AF_INET,SOCK_DGRAM,0)将继续默认为普通UDP,即使在另外支持UDP-Lite的系统中也是如此.
鉴于这些声明:
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协议.
问题中的这两行总会产生相同的结果.