一小时后PING超时

时间:2012-03-22 09:03:18

标签: c sockets raw-sockets

我有一段代码,它将ping命令作为更大代码的一部分来实现。

以下是该方案:

  1. 使用" -c&#34运行ping;或" -t"选项。
  2. 随后通过Ctrl + C终止
  3. 大约一个小时后,我发现ping失败了。
  4. 这是" socket"呼叫:  sock = socket(IP_AF_INET,IP_SOCK_RAW,IP_IPPROTO_ICMP);

    在调用recvfrom之前,套接字设置为1秒的超时值。 当ping失败时,我发现errno设置为EAGAIN。

    我尝试了一些测试,我认为这是因为当按下Ctrl + C时套接字未被关闭。

    我的问题是:如果我不像上述情况那样关闭套接字,我可以面对的问题是什么?

1 个答案:

答案 0 :(得分:0)

单独使用Ctrl-C不会关闭任何内容 - 如果您的进程因此终止,则套接字将以与显式关闭套接字相同的方式关闭。

ICMP套接字有点特殊,因为你可以让任意数量的套接字监听相同的数据包,所以即使你没有关闭它们,这也不会影响其他ICMP套接字。

参与我的水晶球,我会说你打开很多插座,而不是关闭它们,一小时后,用完了文件描述符。只需重用已有的那个,并在不再需要ping任何人时关闭它。