1

socket(AF_INET、SOCK_DGRAM、IPPROTO_UDP)を使用してソケットを作成しました。

これによると、単純なパケットを数回送信すると(send()やsendto()を掛ける)、ECONNREFUSEDを取得できます。ICMPは、前のパケットが到着しなかったことを通知し、ECONNREFUSEDが表示されるはずです。しかし、それは失敗し、errnoはエラーについて報告せず、send()は常に送信されたバイト数を返します。

UDPプロトコルは、実際にはパケットが送信されたことを通知するべきではありません。しかし、私が理解しているように、ICMPはアドバイスを与えることができます。

だから、問題は-なぜECONNREFUSEDを受け取れないのですか?

すべてはWinsockを使用して行われます。

4

2 に答える 2

1

これには2つの理由が考えられます。

  • ターゲットマシンは(何らかの理由で)ICMP返送しません
  • ターゲットマシンICMP返送しますが、winsockそれを正しく解釈しません(特定の古いUnixがこれを行ったことを私は知っています)

要するに、見つけるための最善の策は、スニファを使用することです。wiresharkを試して、ICMPが返されるかどうかを確認してください。

于 2011-04-23T06:29:00.300 に答える
1

情報:WinsockはICMPポート到達不能制御メッセージを無視します

UDPソケットがICMP障害に反応するには、SIO_UDP_CONNRESET経由で制御を有効にする必要があります。WSAIoctl()

WinSock Recvfrom()は、ブロックまたはタイムアウトする代わりにWSAECONNRESETを返すようになりました

于 2012-05-23T23:05:33.510 に答える