【问题标题】:Socket: Client was disconnected or not?套接字:客户端是否断开连接?
【发布时间】:2010-12-20 19:31:48
【问题描述】:

我正在创建套接字服务器。但我不知道,我怎么知道客户端是否断开连接? 我在 Windows 下创建服务器并使用 berkeley 套接字功能(读取、发送、连接......)。 最好我想要一个跨平台的解决方案(没有 WSA 功能)。

我可以写入套接字 0 字节和 ckeck 错误。但这不是很好的解决方案。

【问题讨论】:

  • 如果客户端没有断开连接并且套接字没有数据,读取可能会挂起。或者也许我错了。还是我必须使用非阻塞套接字?
  • @unick 假设你将在一个循环中阅读,对于正常的阅读情况。

标签: windows linux sockets


【解决方案1】:

当客户端断开连接时,您将收到“读取”事件,但 read() 将返回 0。

ssize_t bytes_read;
if ((bytes_read = read(...)) == 0)
{
    // client disconnected
}
else if (bytes_read == -1)
{
    // some sort of error (also no data available when using non-blocking sockets).
}
else
{
    // you have bytes_reads bytes to process
}

【讨论】:

  • 你指出 EAGAIN 是对的,但也有 EINTR,这意味着你的进程在读取时收到了信号。我通常处理这两个。
  • 另外他提到他使用的是Windows,所以他需要使用recv()而不是read()。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多