0

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) エラーを返します。どうすれば修正できますか?

4

1 に答える 1

0

できません。この件に関する私のブログ投稿をご覧ください: http://www.lenholgate.com/blog/2007/12/bug-in-overlapped-udp-port-unreachable-errors.html

XP を使用している場合は、SIO_UDP_CONNRESETwithを使用してレポートWSAIoctlを取得するかどうかを制御できますが、そのセット (またはこれがデフォルトである OS) を使用しても、ICMP がリモートポートのアドレスを取得しません。ポート到達不能が発生しました。ERROR_PORT_UNREACHABLEWSAECONNRESET

チェックしているポートごとに 1 つのソケットを使用することをお勧めします。そうすれば、エラーの原因を特定できます。または、ICMP を直接使用します。

于 2011-06-10T06:50:57.740 に答える