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
.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With