выберите возврат ноль, но есть больше данных и recv тоже работает

Я использую 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;
}

0

Решение

select() возвращает 0, когда его timeout период истекает, поэтому дважды проверьте ваш timeout это точно. Помни что tv_sec выражается в секунд а также tv_usec выражается в микросекунд (1/1000000 секунды). Какой твой usecs параметр выражается в? Микросекунды очень необычны для работы в программировании Windows, миллисекунды (1/1000 секунды) встречаются чаще. Какую ценность вы указываете в своем usecs параметр, когда select() возвращает 0? Скорее всего, вы не справляетесь с usecs правильно и в результате timeout гораздо меньше, чем вы ожидаете.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]