c#原始套接字ip头总长度

本文关键字:ip 原始 套接字 | 更新日期: 2023-09-27 18:29:00

我正在使用udp原始套接字。

例如,我希望只读取每个数据包的第一个64字节。

ipaddr = IPAddress.Parse( "10.1.2.3" );
sock = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP);
sock.Bind(new IPEndPoint(ipaddr, 0));
sock.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.HeaderIncluded, true);
sock.IOControl(IOControlCode.ReceiveAll, BitConverter.GetBytes(RCVALL_IPLEVEL), null);
sock.ReceiveBufferSize = 32768;
byte[] buffer = new byte[64];   // max IP header, plus tcp/udp ports
while (!bTheEnd )
{
    int ret = sock.Receive(buffer, buffer.Length, SocketFlags.None);
    ...
}

我收到了数据包,但都带有IP标头"总长度"<=64.

如果我使用更大的缓冲区(byte[]buffer=new byte[32768]),我得到了正确的"总长度"(现在它的值是<=32768)。

目标是获得所有的数据包,只有IP报头,以及相应的数据包长度;我的例程不必导致数据包碎片进入tcp/ip堆栈。

c#原始套接字ip头总长度

SocketFlags.Peek意味着返回的数据将保持不变,以供后续读取——这就是为什么您在再次读取后会得到相同的数据。要读取不想使用Peek的后续数据包,只需执行不带特殊标志的常规读取即可。

根据文件:

如果您接收的数据报大于缓冲区的大小参数,缓冲区将填充消息的第一部分会丢失多余的数据,并引发SocketException。

这就是你想要的行为吗?