socket的protocal参数
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.
浙公网安备 33010602011771号