сырой сокет сокет датаграмм или нет?
Для неблокирующего сокета дейтаграммы, такого как UDP, когда я вызываю write ()/send () на сокете, каждый вызов write ()/send () или read ()/recv () имеет дело ровно с 1 пакетом.
Мне интересно, является ли raw socket, как показано ниже, сокетом дейтаграммы или нет?
int on = 1;
rawfd = socket(AF_INET, SOCK_RAW, IPPROTO_RAW);
setsockopt(IPPROTO_IP, IP_HDRINCL, &on, sizeof(on));
2 ответов:
Это зависит от типа IP-заголовка, который вы будете включать в свои пакеты (TCP или UDP). На самом деле проще включить заголовок UDP, так как ядро будет управлять некоторым механизмом TCP.
Таким образом, вы должны добавить заголовок UDP в свои пакеты, тогда это будет сокет дейтаграммы.
Когда вы отправляете данные, стек TCP/IP добавит заголовок TCP / UDP, заголовок IP, а затем заголовок Ethernet,и сетевая рабочая карта передаст весь пакет. Для raw сокета вы подготавливаете все заголовки (TCP / UDP, IP и MAC), а сетевая рабочая карта передает весь пакет. Так что, будет ли это дейтаграмма, зависит от заголовка, который вы добавляете-TCP или UDP.
Comments