Как получить недоступный пакет порта ICMP на UDP-сокете в Windows - PullRequest
0 голосов
/ 10 июня 2011

У меня есть приложение, которое использует sendto () с UDP для проверки ресурсов на разных портах. Как я могу получить недоступный пакет порта ICMP с помощью recvfrom ()?

Мой recvfrom () выглядит так:

SOCKADDR_STORAGE saFrom;
int nFromLen = sizeof( SOCKADDR_STORAGE );
nReceived = recvfrom ( Socket, Buffer, BufferSize, 0, ( struct sockaddr * ) &saFrom, (socklen_t *)&nFromLen );

Когда происходит недоступность ICMP-порта, nReceived = -1, а WSAGetLastError () возвращает WSAECONNRESET (10054).

Но так как я проверяю на разных портах, я хотел бы определить способ, которым порт вызвал сообщение о недоступности порта ICMP. Как я могу это определить? (Может быть, я могу установить некоторые параметры сокета?)

Edit: Согласно предложению Лена (используйте только ICMP), я попытался создать сокет за сокетом (AF_INET, SOCK_RAW, IPPROTO_ICMP), а затем вызвать для него функцию recvfrom (). recvfrom () возвращает ошибку 10022 (WSAEINVAL), поскольку сокет не связан. Как мне это исправить?

1 Ответ

0 голосов
/ 10 июня 2011

Вы не можете видеть мой блог на эту тему здесь: http://www.lenholgate.com/blog/2007/12/bug-in-overlapped-udp-port-unreachable-errors.html

Если вы работаете в XP, вы можете использовать SIO_UDP_CONNRESET с WSAIoctl для контроля, если вы получите ERROR_PORT_UNREACHABLE, а не WSAECONNRESET, но даже с этим набором (или в ОС, где это значение по умолчанию) ) вы по-прежнему не получаете адрес удаленного порта, на котором произошел недоступный ICMP-порт.

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

...