Я написал короткое клиентское приложение TCP для тестирования SW-брокера с использованием блокирующих сокетов. Это работает хорошо, и я счастлив с этим. Теперь мне нужно изменить его, и у меня возникла проблема с чтением несанкционированных сообщений (сообщений, поступающих с сервера, не инициированных клиентом), потому что recv () блокирует поток программы до тех пор, пока нет данных для чтения.
Хорошим решением для меня может быть поиск способа проверить, есть ли доступные для чтения данные перед вызовом recv () или что recv () может завершиться, если нет данных для чтения в течение определенного периода.
Итак, я попытался с этой функцией:
static bool isDataAvailable(int socket)
{
fd_set sready;
struct timeval nowait;
FD_ZERO(&sready);
FD_SET((unsigned int) socket, &sready);
memset((char *) &nowait, 0, sizeof(nowait));
bool res = select(socket + 1, &sready, NULL, NULL, &nowait);
if(FD_ISSET(socket, &sready))
res = true;
else
res = false;
return res;
}
//------------------------------------------------------------------------
но в результате после вызова все мое приложение работает так, как я выбрал для работы с использованием неблокирующих сокетов. Я обычно использую его в Linux, и он работает. Я нашел в интернете некоторую информацию о select (), и мне кажется, что он будет работать и под Windows. Но ... что-то идет не так.
Любая помощь и предложение будут оценены.
Спасибо,
Massimo