Документация для socket()
в Linux разделена между различными man-страницами, включая 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 ,Всегда указывая socktype и протокол , вы защищены от любой неопределенности.