问题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头?
有人能指出一个示例代码吗?
答案 0 :(得分:2)
是的,您需要准备两个数据包,每个数据包都有自己的IP头。
如果在第一个数据包中放入1480个字节的数据,在第二个数据包中放入276个数据,那么除了这些字段外,IP标题应该相同:
Fragment Offset
:在第一个数据包中设置为0
,在第二个数据包中设置为1480
; Total Length
:设置为1480加上第一个数据包中的标头长度,276加上第二个数据包中的标头长度; MF
标记:在第一个数据包中设置为1
,在第二个数据包中设置为0
; Header Checksum
:根据需要重新计算不同的标题。