Windows 套接字:客户端是否已断开连接?
我正在创建套接字服务器。但我不知道,我怎样才能知道客户端是否断开? 我正在Windows下创建服务器,并使用berkeley套接字功能(读取、发送、连接…)。 最好我想要一个跨平台的解决方案(没有WSA函数)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
我可以写入套接字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假设在正常读取情况下,您将在循环中读取。