socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
должно работать нормально.
Передача 0 в качестве протокола просто означает, дайте мне значение по умолчанию.Который в каждой системе является TCP для потоковых сокетов и UDP для дейтаграммы, когда имеешь дело с IP.Но socket () может использоваться для многих других целей, давая вам сокет TCP или UDP.
socket () довольно общий характер.socket(AF_INET, SOCK_STREAM, 0);
просто читается как;msgstr "дай мне потоковый сокет в семействе протоколов IP".Передача 0 означает, что у вас нет предпочтений по какому протоколу - хотя TCP является очевидным выбором для любой системы.Но теоретически это могло бы дать вам, например, сокет SCTP.
Если вы хотите, чтобы датаграмма или потоковые сокеты были не неявными для протоколов.Существует намного больше протоколов, исключающих протоколы на основе IP, и многие из них можно использовать либо в дейтаграмме, либо в режиме потоковой передачи, например SCCP, который используется в сетях SS7.
Для протоколов на основе IP SCTP может использоваться в виде дейтаграммы или потоковой передачи.Таким образом сокет (AF_INET, IPPROTO_SCTP);было бы неоднозначно.А для сокетов дейтаграмм есть и другие варианты: UDP, DCCP, UDPlite.
socket (AF_INET, SOCK_SEQPACKET, 0);еще один интересный выбор.Он не может вернуть сокет TCP, TCP не основан на пакетах.Он не может вернуть и UDP-сокет, UDP не дает гарантии последовательной доставки.Но сокет SCTP подойдет, если система его поддерживает.
У меня нет объяснения, почему кто-то сделал комментарий "фиктивный TCP", так как linux netinet / in.h
опция IPv6 HOP by hop.В IPv6 поле дискриминатора протокола также используется в качестве механизма расширения.В пакетах IPv4 есть поле протокола, которое является дискриминатором протокола, для него будет установлено значение IPPROTO_TCP, если эта дейтаграмма IPv4 содержит TCP.Если этот пакет IPv4 также содержит некоторую дополнительную информацию (опции), они кодируются другими механизмами.
IPv6 делает это иначе, если есть расширение (опция), то это расширение кодируется в поле протокола.Таким образом, если пакет IPv6 нуждается в параметре hop-by-hop, IPPROTO_HOPOPTS помещается в поле протокола.Фактическая опция переход за переходом также имеет дискриминатор протокола, который сигнализирует о том, что является следующим протоколом - который может быть IPPROTO_TCP или еще одна опция.