原始套接字的udp数据包碎片

时间:2010-11-16 04:32:04

标签: c++ sockets udp fragmentation

问题packet fragmentation for raw sockets

的后续行动

如果我有一个如此实现的原始套接字:

  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;
      };  

如果我有一个大小为1756的数据包(不包括IP头),如何设置 ipHdr-&gt; fragment_offset (16位,包括3位标志)?
我是否需要准备两个数据包 - 一个大小为1480,另一个大小为276,然后在两个数据包上打上IP头?

有人能指出一个示例代码吗?

1 个答案:

答案 0 :(得分:2)

是的,您需要准备两个数据包,每个数据包都有自己的IP头。

如果在第一个数据包中放入1480个字节的数据,在第二个数据包中放入276个数据,那么除了这些字段外,IP标题应该相同:

  • Fragment Offset:在第一个数据包中设置为0,在第二个数据包中设置为1480;
  • Total Length:设置为1480加上第一个数据包中的标头长度,276加上第二个数据包中的标头长度;
  • MF标记:在第一个数据包中设置为1,在第二个数据包中设置为0;
  • Header Checksum:根据需要重新计算不同的标题。