Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Распределённые приложения и сеть > TCP сервер и клиент


Автор: alex30341 27.1.2008, 11:29
Вопрос к спецам. Я сейчас разрабатываю систему, на которой установлен ТСРсервер. Команда приходит от удаленного клиента и пересылается на контроллер, после чего контролер по RS-232 начинает слать информацию через сервер клиенту до получения от клиенты команды Стоп. Реализация  ТСРсервер и ТСРклиент были взяты с этого сайта (асинхронный режим). Контроллер шлет небольшие пакеты по 30-40 байт. Каждый такой пакет пересылается клиенту как отдельная посылка, client.SendData(packege) . Так вот если работать удаленно то пакеты могут приходить не в том порядке, в котором были отправлены. Замечу, что порядок очень важен, так как это ЭКГ, и соединение к серверу только одно. Кстати если клиент и сервер стоят на одной машине, то все работает без ошибок.  Вопрос как с этим бороться? 

Автор: onsql 27.1.2008, 11:41
Если ты действительно используешь TCP, то там данные приходят именно в том порядке, в которым ты посылал -- за этим следит протокол. Но вот запросто может быть ситуация когда ты послал 80 байт одним send-ом а тебе пришли те же самые 80 байт но двумя кусками, например 40 и 40. Или наоборот ты посылал два пакета по 40 байт, а тебе пришел один блок 80 байт. Возможно у тебя происходит именно это?

Автор: alex30341 27.1.2008, 12:16
Нет проблема не в этом. Пакеты (мои внутренние) маленькие по 30-30 байт и каждый отправляется отдельно и получается отделльно тоже. Т.е.  как я понял каждый мой пакет оборачивается в отдельный пакет ТСР и уходит клаенту. Однако там парядок получения отличается от порядка отправки. Кстати если бы они приходили по 2-3 пакета (моих) разом или разбивались на более мелкие ракеты я бы это увидел на клиенте.

Автор: alex30341 27.1.2008, 16:45
Я все понял... Проблема в асинхронной записи в поток на стороне сервера

См. здесь: http://msdn.microsoft.com/library/rus/default.asp?url=/library/RUS/cpref/html/frlrfSystemIOStreamClassBeginWriteTopic.asp
Текущее положение в потоке обновляется при асинхронном чтении или записи, а не по завершении операции ввода-вывода. Несколько одновременных асинхронных запросов приводят к заполнению запросов в неопределенном порядке.

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

Автор: arilou 30.1.2008, 14:50
alex30341, нумеруй свои пакеты и обрабатывай в правильном порядке. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)