| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Сети > Установка таймаута на сокет |
| Автор: dmitry8 7.2.2018, 07:45 | ||
| Привет! Подскажите, пожалуйста, как установить в клиенте таймаут для отправки и получения данных на сокет в блокирующем режиме. Пытаюсь сделать как в коде ниже, но функция getsockopt возвращает значения, равные 4 миллисекунды, хотя я устанавливал 500. Проблема в том, что connect(fSocket, fSockAddr, sizeof(TSockAddr)) длится более 20 секунд, если сервер не доступен (скажем, нет пинга).
|
| Автор: Snowy 7.2.2018, 11:40 |
| SO_RCVTIMEO и SO_SNDTIMEO устанавливают таймаут на приём и отправку данных. не на коннект. То есть уже после соединения. В случае ожидания соединения, следует поместить connect в цикл и делать последовательные попытки соединения. Попытка соединения 1... Попытка соединения 2... Попытка соединения 3... Попытка соединения 4... |
| Автор: dmitry8 7.2.2018, 12:13 |
| Как же тогда досрочно прервать не успешный коннект, скажем, через 500 мсек, если сервер не отвечает (нет пинга). Т.е. не ждать 20 секунд, чтобы понять, что коннект не удачен? |
| Автор: Snowy 8.2.2018, 11:27 |
| Ну так цикл же твой. Как хочешь так его и прерывай. Можешь завести переменную-флажок и устанавливать её, например, по нажатию кнопки, а в цикле проверять. |
| Автор: dmitry8 27.2.2018, 12:22 | ||
| connect проходит успешно, после него пытаюсь установить таймаут, однако же getsockopt возвращает 4 миллисекунды вместо 500 ???
|
| Автор: Snowy 27.2.2018, 17:56 | ||||
| 4 - это не таймаут - это длина Integer - ты же используешь одну и ту же переменную для получения значения и для размера. Попробуй наоборот:
|