Я использую LibVNC и, включив логи (которые показывают отправленные и полученные байты), я вижу, что сервер отправляет данные. Но мой клиент перестает получать данные в какой-то момент.
Я отладил его и пришел к тому, что: в моем клиенте функция выбора возвращает значение ноль.
Хотя, если я изменяю возвращаемое значение через отладчик, recv продолжает работать и получает данные в порядке, отправленном с сервера. так что вроде все работает нормально.
Я использую клиент и сервер на одной машине, поэтому использую localhost.
Я не знаю, помогает ли это, но это фрагмент кода, который возвращает ноль.
какие-либо предложения, где я должен копать, чтобы найти проблему?
int WaitForMessage(rfbClient* client,unsigned int usecs)
{
fd_set fds;
struct timeval timeout;
int num;
timeout.tv_sec=(usecs/1000000);
timeout.tv_usec=(usecs%1000000);
FD_ZERO(&fds);
FD_SET(client->sock,&fds);
num=select(client->sock+1, &fds, NULL, NULL, &timeout);
if(num<0) {
errno=WSAGetLastError();
rfbClientLog("Waiting for message failed: %d (%s)\n",errno,strerror(errno));
}
return num;
}
select()
возвращает 0, когда его timeout
период истекает, поэтому дважды проверьте ваш timeout
это точно. Помни что tv_sec
выражается в секунд а также tv_usec
выражается в микросекунд (1/1000000 секунды). Какой твой usecs
параметр выражается в? Микросекунды очень необычны для работы в программировании Windows, миллисекунды (1/1000 секунды) встречаются чаще. Какую ценность вы указываете в своем usecs
параметр, когда select()
возвращает 0? Скорее всего, вы не справляетесь с usecs
правильно и в результате timeout
гораздо меньше, чем вы ожидаете.
Других решений пока нет …