Половина Modbus через TCP-кадр, который я посылаю, недействительны

Я сделал приложение на C ++, и мне нужно было получить некоторую статистику из этого приложения на устройство Modbus по протоколу Tcp. TCP связь сделано сокетом и я использую send () для отправки моих данных.

И теперь половина фреймов кажется недействительной: первый фрейм после соединения всегда действителен, а второй всегда ложен … и так далее. И всякий раз, когда я начинаю новое соединение, первый кадр действителен.

Поэтому я проверил на Wireshark и данные Modbus одинаковы (за исключением идентификатора транзакции, который является нормальным). Единственной вещью, которая указывает на проблему, является тот факт, что Wireshark не видит фрейм как фрейм Modbus, если я «разрешаю субдисектору пересобирать tcp-потоки» в опции Wireshark, у меня есть новое поле: «2 повторно собранных сегмента TCP (29 байтов): # 79391 (1), # 79404 (28)» где # 79391 — номер последнего правильного кадра, а # 79404 — номер текущего кадра.

Чтобы избежать этого, я попытался очистить буфер tcp, разрешив TCP_NODELAY, и я получил точно такие же результаты. Так что, если кто-то знает, как отправить данные таким образом, чтобы избежать фрейма Reassemble, я бы с удовольствием попробовал любое решение.

редактировать: я решил свою проблему, TCP не ошибся, конечно. Но он делал что-то, что я не делал невозможным, добавляя бесполезные данные буфера к следующему кадру. Короче говоря, я не отправлял нужное количество Данных.

0

Решение

Я решил свою проблему, конечно, TCP не ошибся. Но он делал что-то, что я не делал невозможным, добавляя бесполезные данные буфера к следующему кадру. Короче говоря, я не отправлял нужное количество Данных. — Жюльен Амар

2

Другие решения


По вопросам рекламы [email protected]