【发布时间】:2011-09-06 12:56:22
【问题描述】:
我用 C 语言编写了一个 TCP 客户端和服务器。这些软件只能在同一台计算机上运行。
1) 我的 TCP 客户端向服务器 (localhost) 发送命令。
2) 服务端努力工作并给出响应。
问题是如果 TCP 客户端关闭连接,我无法检测到客户端连接已关闭,而服务器将执行其长期工作。我只能用 SEND 功能检测到这个,但是已经太晚了,因为服务器已经工作了。
我知道,如果机器是远程的,这一定很难进行检测。在我的情况下,它是同一台机器,这应该使任务更容易,但我没有找到解决方案......可以用select功能吗?
谢谢。
【问题讨论】:
-
在 Posix 上,您可以将套接字设置为非阻塞并执行定期读取。如果您收到
-1并出现错误 EWOULDBLOCK,则您知道连接仍在运行,如果您收到0,您知道连接已关闭。我不知道 Windows 套接字 API 是否也支持非阻塞套接字。select()是另一种选择,虽然有点复杂。 -
@Kerrek:是的,在winsock上你可以使用
ioctlsocket和setsockopt函数来配置套接字,非阻塞标志是可用的设置之一。