0

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

4

1 回答 1

1

SocketFlags.Peek意味着返回的数据将保持不变以供后续读取 - 这就是您再次读取后获得相同数据的原因。要读取您不想使用 Peek 的后续数据包,只需执行不带特殊标志的常规读取。

根据文档:

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

那是你追求的行为吗?

于 2013-08-26T14:08:20.297 回答