2012-03-22 108 views
0

我有一段代码将一个实现ping命令的代码作为更大代码的一部分。一小时后PING超时

下面是这种情况:

  1. 润平用 “-c” 或 “-t” 选项。
  2. 随后通过Ctrl + C终止
  3. 大约一个小时后,我发现ping失败。

这里是 “插座” 呼叫: 袜子=插座(IP_AF_INET,IP_SOCK_RAW,IP_IPPROTO_ICMP);

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

我尝试了一些测试,我相信它是由一个按Ctrl + C时没有被关闭的套接字造成的。

我的问题是:如果我没有像上面提到的场景那样关闭套接字,我可以面对什么问题?

+0

管理运行一些更多的测试,似乎在一个小时后ping失败的初始诊断是不正确的。如果我打开了10个ICMP套接字,现在可以ping通了。当我有10个ICMP套接字打开时,同时ping errno EAGAIN失败。 现在:是否有限制没有。可以同时打开的ICMP套接字? 另外:有什么办法可以回收他们? – Zshn 2012-03-23 03:40:25

回答

0

单独的Ctrl-C不会关闭任何东西 - 如果您的进程因此而终止,那么套接字将以与您明确关闭它的方式相同的方式关闭。

ICMP套接字有些特别,因为你可以让它们中的任何一个监听相同的数据包,所以即使你没有关闭它们,这也不会影响其他ICMP套接字。

搞我的水晶球,我会说你打开大量的套接字,不关闭它们,一小时后,用完文件描述符。只需重新使用已拥有的那个,并在不再需要ping任何人时关闭它。

+0

正在使用的ping命令被实现为较大系统的一部分。因此,Ctrl + C只是关闭那个进程(执行命令ping的那个进程)。在这种情况下,你是否仍然认为SD应该关闭?我使用命令netstat检查并发现sd仍然打开。但是,当整个系统重新启动时,sd将按预期收回。 – Zshn 2012-03-23 03:34:45

+0

如果fd仍然打开,那么该过程仍然存在 - 所以要么你自己处理SIGINT,要么由于某种原因信号没有传递给你的过程(与会话分离,...) – 2012-03-23 08:00:45