Как реализовать правильно timeout на сокетах?

Рейтинг: 0Ответов: 1Опубликовано: 09.07.2011

У мне в голове это выглядит так:

  1. Проверяю функцией ioctlsocket((*this).sock, FIONREAD, &arg); наличие данных для считывания recv;
  2. Если ничего нет, жду например 100 мс и опять проверяю.
  3. Если так раз 5-10 ничего нет - значит сервер не ответил. В противном случае начинаю считывать данные.

Спрашиваю, потому что, если в клиент вызов recv сразу за send происходит быстро, и сервер не успевает обработать и послать обратно сообщение, значит клиенту нечего принять? Или я опять чего то не понял? :)

Дополнено.

Клиент:

  • 1 секунда - клиент отправил данные
  • 2 секунда клиент проверил буффер с помощью ioctlsocket , данных нет

Сервер:

  • 1 секунда - сервер получил данные
  • 2 секунда - сервер обрабатывает данные
  • 3 секунда - сервер посылает данные

Я почему и спрашиваю, может быть такое или нет?

Ответы

▲ 3Принят

Используйте ф-ю select. В нее можно передать время ожидания на данные. Если появляются данные в сокете, она вернет управление. Иначе, по истечению заданного времени, вернется ошибка времени ожидания.