IPPROTO_IP против IPPROTO_TCP / IPPROTO_UDP - PullRequest
21 голосов
/ 22 марта 2011

У меня возникли проблемы с поиском документации о различии этих настроек для третьего аргумента socket.Я знаю о TCP и UDP и их различиях, а также о том, что IP на один уровень вверх (вниз?) В стеке ... Кажется, мой UDP-код работает одинаково, независимо от того, установил ли он значение IPPROTO_IP или IPPROTO_UDP.

1 Ответ

18 голосов
/ 20 января 2016

Документация для 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 и протокол , вы защищены от любой неопределенности.

...