I'm having some trouble finding documentation on what the distinction between these settings for the third argument to socket
is. I know about TCP and UDP and their differences and also that IP is one layer up (down?) on the stack... My UDP code seems to work the same whether I set it to IPPROTO_IP
or IPPROTO_UDP
.
可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
回答1:
Documentation for socket()
on Linux is split between various manpages including ip(7)
that specifies that you have to use 0
or IPPROTO_UDP
for UDP and 0
or IPPROTO_TCP
for TCP. When you use 0
, which happens to be the value of IPPROTO_IP
, UDP is used for SOCK_DGRAM
and TCP is used for SOCK_STREAM
.
In my opinion the clean way to create a UDP or a TCP IPv4 socket object is as follows:
int sock_udp = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
int sock_tcp = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
The reason is that it is generally better to be explicit than implicit. In this specific case using 0
or worse IPPROTO_IP
for the third argument doesn't gain you anything.
Also imagine using a protocol that can do both streams and datagrams like sctp. By always specifying both socktype and protocol you are safe from any ambiguity.