我正在使用 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 堆栈。