0

より大きなコードの一部として ping コマンドを実装するコードがあります。

シナリオは次のとおりです。

  1. 「-c」または「-t」オプションを指定して ping を実行します。
  2. 続いて Ctrl+C で終了
  3. 約 1 時間後、ping が失敗することがわかりました。

「ソケット」呼び出しは次のとおりです。 sock = socket(IP_AF_INET, IP_SOCK_RAW, IP_IPPROTO_ICMP);

recvfrom を呼び出す前に、ソケットは 1 秒のタイムアウト値に設定されます。ping が失敗すると、errno が EAGAIN に設定されていることがわかります。

いくつかのテストを試しましたが、Ctrl+C を押したときにソケットが閉じられていないことが原因であると考えています。

私の質問は次のとおりです。上記のシナリオの場合のように、ソケットを閉じないと直面する可能性のある問題は何ですか?

4

1 に答える 1

0

Ctrl-C だけでは何も閉じません。それが原因でプロセスが終了した場合、明示的に閉じた場合と同じ方法でソケットが閉じられます。

ICMP ソケットは多少特殊です。同じパケットをリッスンするソケットをいくつでも持つことができるため、ソケットを閉じていなくても、他の ICMP ソケットには影響しません。

私のクリスタルボールを使って、あなたはソケットを閉じずにたくさん開いていると思います.1時間後にはファイル記述子が不足しています. すでに持っているものを再利用し、誰かに ping を送信する必要がなくなったら閉じます。

于 2012-03-22T11:01:50.110 に答える