udp 원시 소켓을 사용하고 있습니다.C# raw socket ip header 총 길이
모든 패킷의 첫 번째 예를 들어, 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);
...
}
는 I는 패킷을 수신하지만, IP 헤더 ' "전장"모든 < = 64
I 더 큰 버퍼를 사용하는 경우 (바이트 [완충액 = 새로운 바이트 [32768]), I 오른쪽 총계 길이를 얻었습니다 (현재 값은 < = 32768).
목표는 모든 패킷, IP 헤더 및 해당 패킷 길이를 얻는 것입니다. 루틴이 tcp/ip 스택에 패킷 단편화를 일으킬 필요가 없습니다.
목표는 각 패킷의 처음 64 바이트 만 읽는 것입니다. SocketFlags.Peek를 사용하면 다음 패킷으로 전달하는 방법을 모르겠습니다. SocketFlags.None 함께 첫 번째 바이트 만 읽지 못했습니다. 완벽한 패킷을 읽는 것이 내 목표는 아닙니다. – Massimo
sock.DontFragment = true; 및 sock.Receive (..., SocketFlags.Partial); 도움이되지 않는다. 나는 뭔가를 놓치고 있다고 느낍니다. – Massimo