в вашей ситуации, RAW сокеты будут работать, но вы должны сделать что-то вроде
sock_raw_tcp = socket(AF_INET , SOCK_RAW , IPPROTO_TCP);
sock_raw_udp = socket(AF_INET , SOCK_RAW , IPPROTO_UDP);
sock_raw_icmp = socket(AF_INET , SOCK_RAW , IPPROTO_ICMP);
У вас нет такой опции, как IP_PROTO_IP. Теперь с сокетами RAW вы получите только заголовки IP + заголовки транспортного уровня, но не заголовки Ethernet. Итак, если вас интересуют только данные прикладного уровня и вы хотите использовать IP-заголовок для Ipaddress и TTL и транспортный заголовок для номеров портов и т. Д., То все в порядке. Имейте в виду, что для TCP может потребоваться проверка сумм и повторная сборка. Некоторые контрольные суммы также потребуются для UDP.
Тем не менее, winpcap решает многие проблемы управления для вас, так как он использует драйвер устройства для подключения уровня 2 канала передачи данных вашей сетевой карты или операционной системы. Здесь вы также получите кадр Ethernet и не будете открывать различные типы разъемов RAW. Вам все равно придется применять логику, связанную с приложением, для работы с пакетами, как если бы вы работали на сетевом уровне (уровень 3).