如何在C中调试不洁的套接字闭包?

时间:2011-01-19 10:04:07

标签: c sockets unix network-programming

我有一个网络守护进程(poll()/ accept()/ fork()样式),它正在泄漏套接字文件描述符,每个客户端一个处于TIME_WAIT状态。

据我所知,我可以关闭()然后关闭()绝对不再需要的套接字。其他套接字(例如fork的客户端中的服务器套接字)只是close()ed。所有套接字都设置了SO_REUSEADDR,SO_LINGER关闭。我正在使用_exit()退出程序,我正在使用非阻塞轮询套接字操作,以便在我的信号处理程序中设置一个''dying''标志 - 这允许我以后拿起垂死的标志并释放( ),shutdown(),close(),否则在信号处理程序中会有危险。

但仍然是fd泄漏 - 调试此类问题的最佳方法是什么?这将有助于知道哪个套接字在退出时游荡,因为该过程中涉及许多fds。

干杯!

2 个答案:

答案 0 :(得分:2)

我想出来了。

事实上,我已经通过关闭fork服务器端的cli_fd来修复了这个bug;但是我没有注意到错误已经修复,因为我错误地使用natstat来打开fds。

对于记录,netstat -n | grep TIME_WAIT | wc -l的输出不应该用于计算悬挂的套接字的文件描述符 - 这就是我做错了。请改用lsof或fstat。

无论如何 - 服务器在相当大的负载下不再耗尽fds。

干杯

答案 1 :(得分:2)

TIME_WAIT模式下的套接字没有泄漏 - TIME_WAIT意味着应用程序已完成套接字并关闭它并清理它,但内核仍然记住套接字以便正确响应延迟/孤立/重复可能在网络中浮动的数据包。一段时间后,内核将自动删除TIME_WAIT套接字,但在此之前,它们仍然作为内核的提醒,不再重用该端口,除非应用程序通过SO_REUSEADDR专门请求它。