Ответ 1
Документация для socket()
в Linux разделяется между различными manpages, включая ip(7)
, которая указывает, что вы должны использовать 0
или IPPROTO_UDP
для UDP и 0
или IPPROTO_TCP
для TCP. Когда вы используете 0
, который является значением IPPROTO_IP
, UDP используется для SOCK_DGRAM
, а TCP используется для 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);
Причина в том, что обычно лучше быть явным, чем неявным. В этом конкретном случае использование 0
или хуже IPPROTO_IP
для третьего аргумента не принесет вам ничего.
Также представьте, используя протокол, который может выполнять как потоки, так и датаграммы, такие как sctp. Всегда задавая как носок, так и протокол, вы можете избежать какой-либо двусмысленности.