【问题标题】:How to detect connection closed by localhost?如何检测本地主机关闭的连接?
【发布时间】:2011-09-06 12:56:22
【问题描述】:

我用 C 语言编写了一个 TCP 客户端和服务器。这些软件只能在同一台计算机上运行。

1) 我的 TCP 客户端向服务器 (localhost) 发送命令。

2) 服务端努力工作并给出响应。

问题是如果 TCP 客户端关闭连接,我无法检测到客户端连接已关闭,而服务器将执行其长期工作。我只能用 SEND 功能检测到这个,但是已经太晚了,因为服务器已经工作了。

我知道,如果机器是远程的,这一定很难进行检测。在我的情况下,它是同一台机器,这应该使任务更容易,但我没有找到解决方案......可以用select功能吗?

谢谢。

【问题讨论】:

  • 在 Posix 上,您可以将套接字设置为非阻塞并执行定期读取。如果您收到 -1 并出现错误 EWOULDBLOCK,则您知道连接仍在运行,如果您收到 0,您知道连接已关闭。我不知道 Windows 套接字 API 是否也支持非阻塞套接字。 select() 是另一种选择,虽然有点复杂。
  • @Kerrek:是的,在winsock上你可以使用ioctlsocketsetsockopt函数来配置套接字,非阻塞标志是可用的设置之一。

标签: c winapi winsock


【解决方案1】:

你可以像这样使用select

  • 使用select 读取套接字上的事件。所以select 在套接字可读时解除阻塞
  • 当请求到达服务器时,在不同的线程中开始工作
  • 当客户端关闭连接时,select 将解除阻塞,recv 将读取 0 字节。如果是这样,您可以停止工作线程
  • 如果工作线程在没有被中断的情况下完成任务,它可以发送结果

【讨论】:

    猜你喜欢
    • 2021-11-27
    • 2014-01-16
    • 1970-01-01
    • 2012-08-16
    • 2011-03-09
    • 2016-06-20
    • 2013-01-07
    • 1970-01-01
    • 2017-12-24
    相关资源
    最近更新 更多