Время ожидания PING через час - PullRequest
0 голосов
/ 22 марта 2012

У меня есть фрагмент кода, который реализует команду ping как часть большего кода.

Вот сценарий:

  1. Запуск ping с опцией "-c" или "-t".
  2. Впоследствии завершается с помощью Ctrl + C
  3. Примерно через час я наблюдаю сбой проверки связи.

Вот вызов "socket": sock = socket (IP_AF_INET, IP_SOCK_RAW, IP_IPPROTO_ICMP);

Перед вызовом recvfrom издля сокета установлено значение времени ожидания 1 сек.Когда эхо-запрос завершается неудачно, я вижу, что для errno установлено значение EAGAIN.

Я пробовал некоторые тесты и считаю, что это вызвано тем, что сокеты не закрываются при нажатии клавиш Ctrl + C.

Мой вопрос: с какой проблемой я могу столкнуться, если не закрою сокет, как в случае вышеупомянутого сценария?

1 Ответ

0 голосов
/ 22 марта 2012

Ctrl-C сам по себе ничего не закрывает - если ваш процесс завершается из-за этого, сокет закрывается так же, как если бы вы явно закрывали его.

ICMP-сокеты являются чем-то особенным, поскольку их может прослушивать любое количество одинаковых пакетов, поэтому даже если вы их не закрывали, это не влияет на другие ICMP-сокеты.

Занимаясь моим хрустальным шаром, я бы сказал, что вы открываете много сокетов, не закрываете их и через час исчерпываете дескрипторы файлов. Просто используйте тот, который у вас уже есть, и закройте его, когда вам больше не нужно никого пинговать.

...