сырой сокет сокет датаграмм или нет?



Для неблокирующего сокета дейтаграммы, такого как 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));
570   2  

2 ответов:

Это зависит от типа IP-заголовка, который вы будете включать в свои пакеты (TCP или UDP). На самом деле проще включить заголовок UDP, так как ядро будет управлять некоторым механизмом TCP.

Таким образом, вы должны добавить заголовок UDP в свои пакеты, тогда это будет сокет дейтаграммы.

Когда вы отправляете данные, стек TCP/IP добавит заголовок TCP / UDP, заголовок IP, а затем заголовок Ethernet,и сетевая рабочая карта передаст весь пакет. Для raw сокета вы подготавливаете все заголовки (TCP / UDP, IP и MAC), а сетевая рабочая карта передает весь пакет. Так что, будет ли это дейтаграмма, зависит от заголовка, который вы добавляете-TCP или UDP.

Comments

    Ничего не найдено.