Когда вы создаете необработанный сокет, вы можете указать, к какому протоколу привязываться, UDP, TCP или ICMP, используя параметры протокола IPPROTO_TCP и т. Д. Однако этот параметр определяет только тип сокета, который вы открываете, и, следовательно, какие данные, полученные на этом порту, будут перенаправлены в ваше приложение. Поэтому если вы установите IPPROTO_TCP и откроете необработанный сокет на порту 5000, ваше приложение будет получать необработанные TCP-пакеты, отправленные на порт 5000, но не необработанные UDP-пакеты, отправленные на порт 5000.
Даже если пакеты гарантированно являются TCP, сокет не будет выполнять обычную обработку TCP (syn, ack, reordering и т. Д.), Вы просто получаете необработанные IP-пакеты с порцией двоичных данных, представляющих TCP заголовки. В обычном сокете TCP данные, которые вы получаете, являются данными, встроенными в заголовки TCP. В сокете Raw TCP данные все еще встроены в заголовки канального уровня, поэтому вы увидите заголовок IP, затем заголовок TCP и данные полезной нагрузки для каждого полученного пакета.
Для получения дополнительной информации, ознакомьтесь с этим руководством:
Краткое руководство по программированию на C для необработанных сокетов