2

C# でルーターに ICMP AddressMask 要求を送信しようとしています。ただし、私のソケットは常にタイムアウトするか、タイムアウトが設定されていない場合、アプリケーションが無期限にループします。コードは次のとおりです。

Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.Icmp);
socket.Bind(new IPEndPoint(interfaceAddress, 0));

Random rnd = new Random();
UInt16 seed, sn;

seed = (UInt16)rnd.Next();
sn = (UInt16)rnd.Next();

var icmpAddressMaskRequest = new Byte[12];

icmpAddressMaskRequest[0] = 17;
icmpAddressMaskRequest[4] = (Byte)(seed >> 8);
icmpAddressMaskRequest[5] = (Byte)(seed & 0xff);
icmpAddressMaskRequest[6] = (Byte)(sn >> 8);
icmpAddressMaskRequest[7] = (Byte)(sn & 0xff);

UInt16 checksum = 0;
for (int i = 0; i < 6; i++)
{
    Int32 twoOctects = icmpAddressMaskRequest[2 * i] * 256 + icmpAddressMaskRequest[2 * i + 1];
    Int32 tempChecksum = checksum + twoOctects;

    if (tempChecksum > UInt16.MaxValue)
        checksum = (UInt16)((tempChecksum & 0xffff) + 1);
    else
        checksum = (UInt16)tempChecksum;
}

icmpAddressMaskRequest[2] = (Byte)(255 - checksum >> 8);
icmpAddressMaskRequest[3] = (Byte)(255 - checksum & 0xff);

EndPoint remoteEndPoint = new IPEndPoint(IPAddress.Parse("192.168.100.1"), 0);

socket.ReceiveTimeout = 2000;
socket.SendTo(icmpAddressMaskRequest, remoteEndPoint);

var buffer = new Byte[4096];
socket.ReceiveFrom(buffer, ref remoteEndPoint);

多くのタイプのルーターがアドレス マスク リクエストに応答しないことは知っていますが、単純な Echo-Request でも試してみましたが、結果は同じでした。

4

1 に答える 1

2

Wiresharkのダウンロードから開始する必要があります。これにより、応答が実際に送信されているかどうか (および要求が送信されているかどうか) を確認できます。

pingが応答しないという事実に関して、他の誰かが同じ問題を抱えていました.

Byteこのコードは特に、C# がビット単位の操作を処理する方法に問題がある可能性があります。aは常に署名され、多くの場合 int にアップグレードされ、あらゆる種類の予期しない結果が生じるため、非常に注意する必要があります。

于 2012-01-14T17:15:13.570 に答える