有人可以给我一个如何使用select()来查看客户端是否已关闭套接字连接的示例?
仅供参考.我正在使用linux.
谢谢!
在客户端,我有一个
close(sockfd)
Run Code Online (Sandbox Code Playgroud)
其中sockfd是连接到服务器的套接字.在服务器中我得到了这个:
if (sockfd.revents & POLLERR ||
desc_set[i].revents & POLLHUP || desc_set[i].revents & POLLNVAL) {
close(sockfd.fd);
printf("Goodbye (connection closed)\n");
}
Run Code Online (Sandbox Code Playgroud)
其中sockfd是struct pollfd,而sockfd.fd是客户端套接字的文件描述符.
当客户端像我放在那里那样关闭套接字时,服务器似乎没有用第二个代码(desc_set [i] .revents&POLLHUP等)检测它.
有谁知道这是什么问题?
我的聊天应用程序连接到服务器,用户发送/接收信息.当连接改变时,例如3g-> wifi,wifi-> 3g,丢失数据连接等,套接字有时会在断开连接之前保持连接数年.在此期间,无法判断连接是否仍处于活动状态,似乎消息发送得很好.其他时候,在发送消息时,它会抛出IO错误并断开连接.
除了实现代码来检测连接更改并正确地重新连接之外,是否可以让套接字在连接发生变化时立即抛出IO异常?
编辑:我正在使用以下代码进行连接:
Socket sock = new Socket();
sock.connect(new InetSocketAddress(getAddress(), getPort())), getTimeout());
//get bufferedReader and read until BufferedReader#readLine() returns null
Run Code Online (Sandbox Code Playgroud)
我没有使用setSoTimeout,因为根据远程服务器的配置,数据可能无法长时间传输.