我正在使用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堆栈。
答案 0 :(得分:1)
SocketFlags.Peek
表示返回的数据将保留原样以供后续读取 - 这就是为什么在重新读取后获得相同数据的原因。要读取您不想使用Peek的后续数据包,只需执行没有特殊标志的常规读取。
根据文件:
如果您收到的数据报大于缓冲区的大小 参数,缓冲区填充了消息的第一部分, 多余的数据丢失,抛出SocketException。
这是你追求的行为吗?