UDP で sendto() を使用してさまざまなポートのリソースをチェックするアプリケーションがあります。recvfrom() を使用して ICMP ポート到達不能パケットを取得するにはどうすればよいですか?
私の 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 ポート到達不能メッセージをトリガーしたかを判別する方法が必要です。どうすればそれを判断できますか?(ソケットのオプションをいくつか設定できますか?)
編集: Len の提案 (ICMP のみを使用) に従って、ソケット (AF_INET、SOCK_RAW、IPPROTO_ICMP) ごとにソケットを作成しようとし、recvfrom() を呼び出しました。ソケットがバインドされていないため、recvfrom() は 10022(WSAEINVAL) エラーを返します。どうすれば修正できますか?