【发布时间】:2015-06-10 08:42:54
【问题描述】:
我需要知道客户端是否连接/断开并处理它。
这是我唯一的想法:
while(!serverStop)
{
fd_set rfds, wfdsBefore, wfdsAfter;
FD_ZERO(&rfds);
FD_SET(serverFd, &rfds);
FD_ZERO(&wfdsBefore);
fillWithClientFds(&wfdsBefore); // clients only listen for messages
wfdsAfter = wfdsBefore;
while(1)
{
select(notimportant, &rfds, &wfdsAfter, NULL, NULL);
if (FD_ISSET(serverFd, &rfds)) // new client appeared
break;
if (doSetsDiffer(&wfdsBefore, &wfdsAfter)) // some client disconnected (doesn't work)
break;
}
// inform connected clients about disconnected ones
}
不仅会发生忙等待,而且这种方法甚至不起作用(wfdsAfter 不会改变,尽管客户端关闭了套接字)。
有什么办法吗?唯一的要求是不要使用多线程。
serverFd 是使用 PF_UNIX 和 SOCK_STREAM 标志创建的。
【问题讨论】:
-
这不是忙等待。
select()块!要知道一个工作套接字已断开连接,您必须read()它并获得 0 个字节作为回报,或者尝试write()到一个损坏的套接字并失败。除非发生这两种情况之一,否则将套接字视为已连接 -
在这种情况下不会,因为
select()会立即返回要写入的描述符,即使它们对应的套接字已经关闭。 -
客户端不发送任何内容,因此
read()将始终返回 0,我不想通过write()发送任何无意义的数据,只是为了检查连接是否仍然正常(除非我可以发送 0 个字节仍然失败)。 -
你的理解有误。读写集的差异并不意味着客户端消失了。可靠地检测断开的 TCP 连接的唯一方法是写入它。如果没有数据被交换,你究竟是为了什么而浪费套接字和连接?
-
有数据交换。服务器通知所有连接的客户端有关新的连接/断开连接。
标签: c sockets unix file-descriptor unix-socket