【问题标题】:TCP socket serverTCP 套接字服务器
【发布时间】:2015-09-03 05:59:19
【问题描述】:
Active Internet connections (w/o servers)
Prot Rec Sen Local Address        Foreign Address     State       PID/PXX
tcp  1   0   192.169.3.120:64007  192.169.3.104:40968 CLOSE_WAIT  -               
tcp  7   0   192.169.3.120:64007  192.169.3.104:44637 CLOSE_WAIT  -               
tcp  17  0   192.169.3.120:64007  192.169.3.104:39950 CLOSE_WAIT  -               
tcp  7   0   192.169.3.120:64007  192.169.3.104:34229 CLOSE_WAIT  - 

以上回复来自sudo netstat -p

我有一个连接了客户端的应用程序示例服务器。然后我停止了应用程序并再次启动它说绑定错误,因为我没有使用 SO_REUSEADDR。我看到close_wait中的clinet连接很少。我看到我们需要关闭该特定套接字的 processid。但 netstat -p 给出空白进程 ID。那么如何杀死这个进程以及有什么方法可以使用 c apis 杀死所有套接字(完全是全部)。

【问题讨论】:

  • 为什么要明确地杀死它们?它们处于超时模式,很快就会从系统中删除
  • "... 给出空白进程 id。所以如何杀死这个进程 id" 你不能,因为没有进程,这从空的 PID 字段很明显。
  • 可能感兴趣:*.com/questions/15912370/…
  • @mangusta CLOSE_WAIT 不是超时模式。你在说什么?
  • 对了,能不能看一下服务器代码?和客户端代码?如果没有一些代码,很难推测那里会发生什么。而且,你完全确定你做了正确的netstat 命令吗?请参阅下面的答案。

标签: c linux sockets tcp


【解决方案1】:

CLOSE_WAIT 状态表示某个远程客户端已经发送了一个FIN 段来表示它不会发送更多数据,并且已经发送了一个ACK 来确认,但是应用程序进程还没有@987654324 @d 套接字和内核正在等待本地端关闭。必须有一个本地进程在某个地方打开了该套接字,因为状态只是在等待本地关闭。

还有一些状态不显示内核管理的套接字上的进程(因为没有)。但是CLOSE_WAIT 表示本地进程已收到来自远程端的关闭,但尚未自行关闭。由于内核代表进程执行的任务之一是关闭其所有描述符,如果进程具有exit(2)ed,则必须向套接字发出关闭信号,将状态CLOSE_WAIT 移动到LAST_ACK (一般看不到)

【讨论】:

    【解决方案2】:

    我看到我们需要关闭那个特定套接字的 processid

    我无法想象你在哪里看到的,但是当端口处于 CLOSE_WAIT 状态时,它表明应用程序需要关闭 socket。你有一个套接字泄漏。

    【讨论】: