Winsock send () проблема с однобайтовой передачей

0

Я испытываю неудовлетворительное поведение оконных сокетов, на которые я не могу найти информацию, поэтому я решил попробовать здесь.

Моя проблема заключается в следующем:

У меня есть приложение C++, которое служит драйвером устройства, обмениваясь информацией с последовательным устройством, подключенным через последовательный порт к конвертеру TCP/IP. Для последовательного протокола требуется много однобайтовых сообщений для связи между устройством и моим программным обеспечением. Я заметил, что эти небольшие сообщения отправляются только 3 раза после запуска, после чего они больше не передаются (проверяется с помощью wirehark). Все время метод send() возвращает return> 0, указывая, что сообщение было скопировано в буфер отправки. Я использую блокирующие сокеты.

Я обнаружил эту проблему, потому что этот конкретный драйвер в конечном итоге должен отключить его, когда буфер отправки полностью заполнен (select() не удается из-за этого через 5 часов, но это происходит намного раньше, когда я уменьшаю размер SO_SNDBUF).

Я проверил и заметил, что когда я вызываю send с сообщениями размером 2 байта или больше, передача никогда не прерывается.

Любой вход был бы очень оценен, я не в курсе, как это исправить.

Теги:
sockets
tcp

1 ответ

0

Это редкий случай, когда вы должны установить TCP_NODELAY, чтобы посылки были написаны индивидуально, а не объединены. Но я думаю, что у вас есть еще одна проблема. Вы уверены, что читаете все, что отправляется обратно? И действуя на нем должным образом? Это звучит как проблема протокола приложения для меня.

  • 0
    Я уже экспериментировал как с TCP_NODELAY, так и с SO_SNDBUF, установленным в 0 с неблокирующими портами. Не имеет никакого отношения к поведению при отправке. Я мог бы добавить, что отправка вызова вызывает зависание после первых нескольких вызовов при использовании неблокирующих портов с SO_SNDBUF, установленным в 0.
  • 0
    Конечно, это так. Я не вижу смысла обнуления SO_SNDBUF, но именно так я и ожидал, что он будет себя вести. Мне кажется, что устройство даже не читает из соединения.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню