Pull to refresh

Comments 8

Надеюсь, автор осознает, что этот способ — костыль? Много стремного: мало того, что Вы меняете таймаут сокету, которым не владеете, и не знаете, как он используется, так Вы еще не используете никаких способов синхронизации. Да и смысла в синхронизации-то нет, потому что Вы не владеете кодом, где этот сокет создается и где с ним работают.
То, что у Вас пока ни разу еще не сломалось при таком подходе, — это просто вопрос времени.


И, кстати, в примере не видно C++, чистое C.

Безусловно — это костыль! То что данный метод бессбойно работает в упомянутом проекте, это не делает его «штатным» или «рекомендуемым к использованию». Как и всякий метод определения чего бы то ни было по косвенным признакам (хотя… ядерная физика… :).
Просто этот метод на данный момент — единственный известный мне, а теперь и вам.
Насчет «с++» — я просто не нашел тега «с» :)
Звучит весьма спорно.
Во-первых,
If a blocking receive call times out, the connection is in an indeterminate state and should be closed.
То есть, я так понимаю, это UB. Либо я неправильно понимаю SO_RCVTIMEO на MSDN?

Во-вторых, side-эффекты этого способа не очень предсказуемы. Это race condition как минимум. Я у себя легко его воспроизвёл.
Соединение не закрывается — проверенно. После применения этой функции, recv() и send() работают как обычно.

Про непредсказуемость — вы абсолютно правы. Как и всякий костыль, это нельзя рекомендовать к применению, но на данный момент это единственный метод, за неимением штатного.

Насчёт костыля: а сколько раз вам нужно было определить?
Если dll не совсем безумная и не передаёт вам то blocking, то non-blocking — то один раз посмотреть посредством костыля — вроде нормально (костыль не идёт в prodaction, оставшись в тулзе для внутреннего пользования).

Вот в том то и дело, что DLL совершенно непредсказуема. Там очень сложные отношения с поставщиками уникального оборудования, и вообще всякая мышиная возня за кусочек сыра. Не хочу об этом.
В таком случае, может, ioctlsocket, WSAIoctl, WSAASync… перехватить и поддерживать свою информацию о блокировании сокетов? Тоже гонка будет, конечно, но хоть не надо будет таймаут менять.
Sign up to leave a comment.

Articles