У меня есть приложение, которое использует 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), поскольку сокет не связан. Как мне это исправить?