【发布时间】:2012-03-18 08:30:26
【问题描述】:
我有这段代码,用于检查 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() 真的是这样吗?它不应该告诉您由于网络连接已经断开,因此套接字不可写吗?
什么是最好的解决方案?
【问题讨论】:
-
如果您发送数据,那么您会得到某种响应,对吧?
-
如果我使用 sendto() 发送,则不会报告错误,它就像实际发送一样。
-
您不会在此处收到任何错误报告。
sendto的作用只是通过网络发送数据,并不检查数据是否到达对方。 -
我说的是你是否从接收者那里得到任何返回数据。我的意思是你在使用
recvfrom或其他类似的功能吗?