0

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

这是场景:

  1. 使用“-c”或“-t”选项运行 ping。
  2. 随后通过 Ctrl+C 终止
  3. 大约一个小时后,我观察到 ping 失败。

这是“套接字”调用: sock = socket(IP_AF_INET, IP_SOCK_RAW, IP_IPPROTO_ICMP);

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

我尝试了一些测试,我认为这是由于按下 Ctrl+C 时套接字未关闭造成的。

我的问题是:如果我不像上面提到的场景那样关闭套接字,我会面临什么问题?

4

1 回答 1

0

单独的 Ctrl-C 不会关闭任何东西——如果您的进程因此而终止,则套接字的关闭方式与您显式关闭它时的方式相同。

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

使用我的水晶球,我会说你打开了很多套接字,而不是关闭它们,一个小时后,文件描述符用完了。只需重复使用您已有的,并在您不再需要 ping 任何人时将其关闭。

于 2012-03-22T11:01:50.110 回答