Я испытываю неудовлетворительное поведение оконных сокетов, на которые я не могу найти информацию, поэтому я решил попробовать здесь.
Моя проблема заключается в следующем:
У меня есть приложение C++, которое служит драйвером устройства, обмениваясь информацией с последовательным устройством, подключенным через последовательный порт к конвертеру TCP/IP. Для последовательного протокола требуется много однобайтовых сообщений для связи между устройством и моим программным обеспечением. Я заметил, что эти небольшие сообщения отправляются только 3 раза после запуска, после чего они больше не передаются (проверяется с помощью wirehark). Все время метод send() возвращает return> 0, указывая, что сообщение было скопировано в буфер отправки. Я использую блокирующие сокеты.
Я обнаружил эту проблему, потому что этот конкретный драйвер в конечном итоге должен отключить его, когда буфер отправки полностью заполнен (select() не удается из-за этого через 5 часов, но это происходит намного раньше, когда я уменьшаю размер SO_SNDBUF).
Я проверил и заметил, что когда я вызываю send с сообщениями размером 2 байта или больше, передача никогда не прерывается.
Любой вход был бы очень оценен, я не в курсе, как это исправить.
Это редкий случай, когда вы должны установить TCP_NODELAY, чтобы посылки были написаны индивидуально, а не объединены. Но я думаю, что у вас есть еще одна проблема. Вы уверены, что читаете все, что отправляется обратно? И действуя на нем должным образом? Это звучит как проблема протокола приложения для меня.