фрагментация пакетов udp для необработанных сокетов - PullRequest
2 голосов
/ 16 ноября 2010

Продолжение вопроса Фрагментация пакетов для необработанных сокетов

Если у меня реализован необработанный сокет следующим образом:

  if ((sip_socket = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) < 0)
      {
    cout << "Unable to create the SIP sockets."<< sip_socket<<" \n";
    return -3;
      }

   if ( setsockopt(sip_socket, IPPROTO_IP, IP_HDRINCL, &one, sizeof(one)) == -1)
      {
   cerr << "Unable to set option to Raw Socket.\n";
   return -4;
      };  

как установить ipHdr-> frag_offset (16 бит, включая 3-битные флаги), если у меня есть пакет размером 1756 (не включая заголовок IP)?
Нужно ли подготовить два пакета - один размером 1480 и другойразмером 276, а затем ударить заголовки IP на обоих пакетах?

Кто-нибудь может указать пример кода для этого?

1 Ответ

2 голосов
/ 16 ноября 2010

Да, вам нужно подготовить два пакета, каждый с собственным IP-заголовком.

Если вы поместите 1480 байт данных в первый пакет и 276 во второй, тогда заголовки IP должны быть идентичны, за исключением следующих полей:

  • Fragment Offset: установите в 0 в первом пакете и 1480 во втором;
  • Total Length: установите значение 1480 плюс длина заголовка в первом пакете и 276 плюс длина заголовка во втором пакете;
  • MF флаг: установите в 1 в первом пакете и 0 во втором;
  • Header Checksum: при необходимости пересчитывается по различным заголовкам.
...