IPPROTO_IP与IPPROTO_TCP/IPPROTO_UDP

Ste*_* Lu 23 sockets ip

我在查找关于第三个参数的这些设置之间的区别的文档时遇到了一些麻烦socket.我知道TCP和UDP及其差异以及IP是堆栈上的一层(向下?)...我的UDP代码似乎工作相同,无论我将其设置为IPPROTO_IPIPPROTO_UDP.

Pav*_*rda 20

socket()Linux上的文档分为各种联机帮助页,包括ip(7)指定必须使用0IPPROTO_UDP用于UDP和/ 0IPPROTO_TCPTCP.当您使用时0,其值恰好为IPPROTO_IPUDP,并且使用SOCK_DGRAMTCP 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);
Run Code Online (Sandbox Code Playgroud)

原因是明确而不是隐含通常更好.在这个特定的情况下使用0或更糟糕IPPROTO_IP的第三个参数不会获得任何东西.

还想象一下使用一个可以同时执行流和数据报的协议,比如sctp.通过始终指定socktypeprotocol,可以避免任何歧义.