即使您的网络连接断开,套接字是否仍可写入?

时间:2012-03-18 08:30:26

标签: c sockets select

我有这个代码,我用来检查UDP套接字是否可写,然后它应该发送一些数据,如果它是可写的。我需要连续发送数据,但只要我的互联网连接断开连接就应该停止发送。应用程序在使用调制解调器的计算机上运行,​​但有时调制解调器挂断但我的应用程序仍然尝试发送数据而不知道互联网连接不再可用。

打开UDP套接字

int socket_fd;
addr.sin_family = AF_INET;
addr.sin_port = htons(999);
addr.sin_addr.s_addr = ip_of_server; 

socket_fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
bind(fd, (struct sockaddr*)&addr, sizeof(addr));

检查套接字是否可写,然后发送一些数据

struct timeval tv;
fd_set write_fds;
int ready;

tv.tv_sec = 0;
tv.tv_usec = 0;
FD_ZERO(&write_fds);
FD_SET(socket_fd, &write_fds);

ready = select(socket_fd + 1, NULL, &write_fds, NULL, &tv);

if ( ready && FD_ISSET(socket_fd, &write_fds) ) 
{

    //Send data here

}

我的问题是select()仍然报告即使断开我的互联网连接,套接字也是可写的。 select()是否真的以这种方式执行?它不应该告诉你套接字不可写,因为网络连接已经断开了吗?

对此最好的解决方案是什么?

2 个答案:

答案 0 :(得分:4)

UDP套接字始终可写。

您应该只使用select()来轮询tcp套接字是否可写。

答案 1 :(得分:2)

由于您正在发送数据,我猜您也会收到另一方的某种回复。如果是这种情况,那么在发送请求之后,如果您的数据发送机制是同步的(您发送数据,接收响应然后再发送数据),您可以等待一段时间的回复。如果该时间间隔到期,那么您应该假设网络不工作且连接中断,因此终止您的应用程序。

如果您的数据发送机制不是同步的(无论您获得什么样的响应,您都会连续发送数据),那么您应该启动一个更新某种计时器的线程。如果在计时器达到某个阈值(您应该根据您的要求决定)之前没有得到任何响应,那么您可以假设网络已损坏,然后终止该应用程序。