Добрый всем день. Скажите - нормально ли работают тайм-ауты на сокетах в Убунте?
Проблемы две. Во-первых - пытаюсь установить тайм-аут:
Socket.SetRecvTimeout >
synsock.SetSockOpt(FSocket, integer(SOL_SOCKET), integer(SO_RCVTIMEO), @timeval, SizeOf(timeval));
мне возвращается ошибка 22, EINVAL - invalid argument, передавал в либу таймаут = 100000.
Также необходимо вызывать Socket.CanRead, пытался делать это с параметром 0 либо 1 - в обоих случаях получал зависание, тайм-аут не срабатывает.
Под Windows оба случая работают нормально.
Тайм-ауты сокетов в Убунте
Модератор: Модераторы
-
ElectroGuard
- новенький
- Сообщения: 71
- Зарегистрирован: 03.06.2016 11:10:22
потому что под линукс нужно специальную структуру передавать, а не целочисленное значение
-
ElectroGuard
- новенький
- Сообщения: 71
- Зарегистрирован: 03.06.2016 11:10:22
timeval же и передаю - и ошибку возвращает
1) Для корректной работы структура должна состоять из двух 8байтовых полей.
2) Кто нибудь знает почему система округляет значение tv_usec до миллисекунд. Например, если SetSockOpt tv_usec = 123456, то GetSockOpt tv_usec = 123000. Как быть, если таймаут нужно передать именно в микросекундах? И поддерживает ли ОС Ubuntu 16 такие таймауты?
2) Кто нибудь знает почему система округляет значение tv_usec до миллисекунд. Например, если SetSockOpt tv_usec = 123456, то GetSockOpt tv_usec = 123000. Как быть, если таймаут нужно передать именно в микросекундах? И поддерживает ли ОС Ubuntu 16 такие таймауты?
Стандартно SystemClock=1kHz = 1msec. Раньше был параметер настройки ядра перед его компилярированием, где можно было выставить SystemClock = 1MHz для мульмедиа программ. Сейчас почти в каждом дистро есть готовое ядро с Real-Time расширением (Soft real time). Установите его должно помочь.
А почему нельзя использовать неблокирующий секет?
