4
我在使用Perl服务器中的套接字时遇到了一些麻烦。您如何知道套接字客户端断开连接?
你怎么知道刚刚断开的(非阻塞)客户端? 在C,我已经习惯了做
if (recv(sock, buff, size, flags) == 0) {
printf("Client disconnected\n";
}
或Python或其他语言的等价物:recv
返回-1,如果没有可用数据,0,如果客户端退出,如果数据可能被读取的正数。
但是perl的recv
不能这样工作,并且使用$data = <$sock>
似乎没有给出任何可能性知道。
有没有(简单)的可能性?
您是否使用任何异步框架? – creaktive
注意。当你说“如果没有数据可用,recv返回-1”。这不完全正确。当没有可用数据时,recv将返回-1,并将errno设置为EAGAIN或EWOULDBLOCK。但还有其他一些情况,recv可能返回-1 - 主要是由于TCP连接中断(例如,远程对象崩溃而没有关闭socket,失去互联网等)。换句话说,你不应该依赖recv返回的“-1”。始终检查相应的errno以查看它是否是可恢复的错误。 – selbie
谢谢@selbie,我不知道。 – Fabien