Windows 套接字:客户端是否已断开连接?

Windows 套接字:客户端是否已断开连接?,windows,linux,sockets,Windows,Linux,Sockets,我正在创建套接字服务器。但我不知道,我怎样才能知道客户端是否断开? 我正在Windows下创建服务器,并使用berkeley套接字功能(读取、发送、连接…)。 最好我想要一个跨平台的解决方案(没有WSA函数) 我可以写入套接字0字节和ckeck错误。但这不是一个好的解决方案 当客户端断开连接时,您将得到一个“read”事件,但read()将返回0 ssize_t bytes_read; if ((bytes_read = read(...)) == 0) { // client disc

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


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

当客户端断开连接时,您将得到一个“read”事件,但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
}

当客户端断开连接时,您将得到一个“read”事件,但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()。你指出EAGAIN是对的,但还有EINTR,这意味着你的进程在读取时得到了一个信号。我通常会处理这两个问题。他还提到他使用的是Windows,所以他需要使用recv()而不是read()。如果客户端未断开连接并且套接字没有数据,read可能会挂起。也许我错了。或者我必须使用非块套接字?@unick假设在正常读取情况下,您仍将在循环中读取。如果客户端未断开连接且套接字没有数据,则读取可能挂起。也许我错了。或者我必须使用非块套接字?@unick假设在正常读取情况下,您将在循环中读取。