c#raw socket ip header总长度

时间:2013-08-26 13:58:38

标签: c# sockets partial raw-sockets peek

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

1 个答案:

答案 0 :(得分:1)

SocketFlags.Peek表示返回的数据将保留原样以供后续读取 - 这就是为什么在重新读取后获得相同数据的原因。要读取您不想使用Peek的后续数据包,只需执行没有特殊标志的常规读取。

根据文件:

  

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

这是你追求的行为吗?