2

この問題について少し混乱しています:-)。Ubuntu 10.04 でいくつかのコードを実行していますが、これは recvmsg 呼び出しを使用してオーディオ UDP パケットを受信して​​います。この部分は、私がネット上のリモート システムでテストしてきた、より大きな SIP クライアントの一部です。

通常、私は問題なく通話を確立でき、オーディオはリモートソースからプログラムに問題なく送信されます. ただし、ランダムな時間が経過すると、ポートで読み取りエラーが発生します。これが発生すると、errno EHOSTUNREACH が表示されます。このエラーで、ポートをシャットダウンして接続を切断しました。

これの奇妙な点は、これが ICMP メッセージに応答して発生するという印象を受けていたことです。一時的なネットワーク障害が原因である可能性があります。ただし、この問題を再現して完全なパケット キャプチャを実行した後、ICMP の ping と応答がどこにあるかをすべて確認できました。カーネルが EHOSTUNREACH として解釈する ICMP エラー メッセージは見当たりませんでした。

私のUDPポートはかなり基本的です。本当に必要な場合は、コードを投稿できます。しかし、これは単なる基本的な SOCK_DGRAM です。ソケットは、このエラー状態になる前に 8 時間以上データを受信できる場合があります。

この問題にさらに取り組む方法についてのアイデア。関連付ける ICMP メッセージがないのにこの errno を受信する理由を理解しようとしています。

4

1 に答える 1

0

同じソケットを使用してパケットを送信していますか?または、同じポートを共有する別のソケットですか?別のソケットが実際にエラーを生成している可能性があるかどうか知りたいです。

何年も前に、あなたが説明したように、sendtoとrecvfromの両方が断続的に失敗するICMPメッセージを扱っていたことを覚えています。そして、私が思い出した場合、回避策はそれを無視して別のrecvfrom/recvmsgを実行することです。

回線上にICMPメッセージが表示されないのに、なぜそのエラーコードが表示されるのかについては、私にはわかりません。「pingと応答」として観察したICMPメッセージを正しく却下していると確信していますか?ICMPメッセージにはポート番号がないため、そのリモートホストに関連付けられているすべてのソケット(またはランダムなソケット)がこのエラーコードを返す可能性があります。

この動作を無効にするioctlがあるかもしれないと思いましたが、見つかりませんでした。

ここで同様の議論。

于 2013-02-24T21:46:49.373 に答える