ICMP сокет всегда тайм-аут - PullRequest
       10

ICMP сокет всегда тайм-аут

2 голосов
/ 14 января 2012

Я пытаюсь отправить запрос ICMP AddressMask на мой маршрутизатор в C #.Тем не менее, мой сокет всегда тайм-аут или, если тайм-аут не установлен, цикл приложения бесконечно.Вот код:

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);

Я знаю, что многие типы маршрутизаторов не отвечают на запрос маски адреса, но я пытался даже с простым эхо-запросом, и результат был таким же.

1 Ответ

2 голосов
/ 14 января 2012

Вы должны начать с загрузки Wireshark , это позволит вам увидеть, действительно ли отправляется ответ (и отправляется ли ваш запрос).

Что касается того, что пинг не отвечает, у кого-то еще была та же проблема .

В этом коде могут возникать проблемы с тем, как C # обрабатывает побитовые операции, поэтому вам нужно быть очень осторожным, потому что Byte всегда подписывается и часто обновляется до типа int, что приводит к неожиданным результатам.

...