Странные редкие неупорядоченные данные, полученные с помощью Indy - PullRequest
0 голосов
/ 14 марта 2010

У нас странная проблема с Indy10, когда две большие строки (по несколько сотен символов каждая), которые мы посылаем одну за другой с помощью TCP, появляются на другом конце, странным образом переплетенными. Это случается крайне редко.

Каждая строка представляет собой полное сообщение XML, оканчивающееся LF, и в общем случае процесс READ считывает сообщение XML целиком, возвращаясь, когда видит LF.

Вызов для фактической отправки сообщения защищен критической секцией вокруг вызова метода IOHandler writeln, и поэтому два потока не могут отправлять одновременно. (Мы уверены, что критический раздел реализован / работает должным образом). Эта проблема случается очень редко. Симптомы странные ... когда мы отправляем строку A, за которой следует строка B, то, что мы получили на другом конце (в тех редких случаях, когда у нас происходит сбой), представляет собой конечную часть строки A (, т.е. ). , в конце есть LF), за которым следует начальный раздел строки A, а затем вся строка B, за которой следует один LF. Мы убедились, что свойство «timed out» не соответствует действительности после частичного чтения - мы регистрируем это свойство после каждого чтения, которое возвращает содержимое. Кроме того, мы знаем, что в строке нет встроенных символов LF, поскольку мы явно заменяем все не алфавитно-цифровые символы в строке пробелами перед добавлением LF и его отправкой.

У нас есть механизмы регистрации внутри критических секций как на передающей, так и на принимающей сторонах, и поэтому мы можем увидеть это поведение на «проводе».

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

У кого-нибудь есть яркие идеи?

Ответы [ 4 ]

4 голосов
/ 14 марта 2010

Вы можете попробовать Wireshark , чтобы узнать, как данные передаются. Таким образом, вы можете узнать, находится ли проблема на сервере или на клиенте. Также не забудьте использовать TCP для получения «гарантированных» действительных данных в правильном порядке.

3 голосов
/ 14 марта 2010

Вы используете TCP или UDP? Если вы используете UDP, возможно (и ожидается), что пакеты UDP могут быть получены в другом порядке, чем они были переданы из-за маршрутизации по сети. Если это так, вам нужно добавить какой-либо идентификатор пакета в каждый пакет UDP, чтобы получатель мог правильно упорядочить пакеты.

2 голосов
/ 03 августа 2010

Вы проверили настройки Nagle IOHandler? У нас была похожая проблема, которую мы исправили, установив для UseNagle значение false. В нашем случае отправка и получение больших объемов данных в пакетах происходили медленно из-за объединения Nagle, поэтому это не совсем то же самое, что и ваша ситуация.

2 голосов
/ 03 августа 2010

У вас есть несколько потоков, считывающих из одного сокета одновременно на принимающей стороне? Даже просто запрос состояния Connected () вызывает чтение. Это может привести к тому, что несколько потоков прочитают входящие данные и сохранят их в IOHandler.InputBuffer в случайном порядке, если вы не будете осторожны.

...