Разъем все еще доступен для записи, даже если ваше сетевое соединение отключено? - PullRequest
1 голос
/ 18 марта 2012

У меня есть этот код, который я использую, чтобы проверить, доступен ли для записи сокет 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 ]

4 голосов
/ 18 марта 2012

сокет UDP всегда доступен для записи.

Вы должны использовать select () только для опроса, доступен ли для записи сокет tcp.

2 голосов
/ 18 марта 2012

Поскольку вы отправляете данные, я полагаю, что вы также получаете какие-то ответы с другой стороны. Если это так, то после отправки запроса вы можете подождать ответа в течение определенного периода времени, если ваш механизм отправки данных работает синхронно (вы отправляете данные, получаете ответ, а затем снова отправляете данные). Если этот интервал истекает, вы должны предположить, что сеть не работает и ваше соединение разорвано, поэтому прекратите работу приложения.

Если ваш механизм отправки данных не является синхронным (вы отправляете данные непрерывно, независимо от того, какие ответы вы получаете), тогда вы должны запустить поток, который обновит некоторый таймер. Если вы не получите никаких ответов до того, как таймер достигнет определенного порогового значения (которое вы должны решить в соответствии с вашими требованиями), вы можете предположить, что сеть не работает, а затем завершить работу приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...