linux - 选择系统调用在 n/w 应用程序中无限期挂起。

标签 linux sockets network-programming

我们有一个网络应用程序,它将在各种脚本中使用以与其他系统通信。

有时,脚本会在调用我们的网络应用程序时挂起。我们最近遇到了挂起,我尝试调试这个特定应用程序的挂起进程。

此应用程序由客户端和服务器(守护进程)组成,挂起发生在客户端。

Strace 输出显示它卡在一个选择的系统调用上。

> strace -p 34567
select(4, [3], NULL, NULL, NULL

如您所见,select 调用没有超时,如果文件描述符“3”未准备好读取,它会无限期阻塞。

lsof 输出显示 fd '3' 处于 FIN_WAIT2 状态。

> lsof -p 34567
client  34567 user 3u  IPv4 55184032 TCP client-box:smar-se-port2->server:daemon (FIN_WAIT2)

以上信息是否暗示了什么? FIN_WAIT2 状态?我检查了服务器端(应该运行相应的守护进程),但是服务器端没有运行守护进程。我的猜测是守护进程成功运行并将输出发送到客户端,它应该在 fd '3' 上可用以供读取,但是客户端上的 select() 调用永远不会出现,并且仍在等待某些事情发生!

我不确定为什么它永远不会从 select() 调用中出现,这只是偶尔发生,大多数时候应用程序运行良好。

有什么线索吗?

Server和client都是SuSE Linux。

最佳答案

FIN_WAIT2 表示您的应用已向对等方发送了一个FIN 数据包,但尚未从对等方收到FIN。在 TCP 中,正常关闭需要双方的 FIN。服务器守护进程未运行的事实意味着守护进程退出(或被杀死)而没有通知其对等方(您)。所以您的 select() 正在等待它不再接收的数据包,并且必须等待操作系统使用内部超时使套接字无效,这可能需要很长时间。在这种情况下,您应该永远不要使用无限超时。使用适当的超时并在超时结束时采取相应措施。

关于linux - 选择系统调用在 n/w 应用程序中无限期挂起。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21512613/

相关文章:

linux - 我可以在 Linux 上构建和编译跨平台 Xamarin 应用程序吗?

linux - 在 docker windows 上运行 linux 容器

javascript - AngularJS:$watch——加快速度

linux - RedHat daemon函数使用

python - 在同一个套接字上监听时多个进程之间的巨大 CPU 时间差异

c# - 套接字术语 - "blocking"是什么意思?

c - socket - close(2) 发送 RST 数据包而不是 FIN 数据包

java - 如何从多个客户端接收文件?

c - 如何将客户端重新连接到服务器?

c++ - 从缓冲区指针计算堆栈中的返回地址