Re: Быстрая пересылка через Socket
От: stump http://stump-workshop.blogspot.com/
Дата: 10.10.07 10:12
Оценка: 1 (1)
Здравствуйте, impure_soul, Вы писали:

_>Доброго времени суток.

_>Вопрос в следующем. Есть сервер, основная задача которого — пересылка данных между двумя клиентами (т.е. он просто принимает с одного сокета и отправляет на другой).
_>Данные от клиента идут "пакетами" по 65536 байт или меньше (как получится). Если интервал между отправкой двух пакетов от одного клиента больше 100 мс, то всё работает нормально. Если задержку не ставить, то получающий клиент не может десериализовать сообщение т.к. вместо отправленых, например, 33500 байт получает 65536 или вообще что-то другое (например 1024 байта). Не могу понять где и почему портится пакет. После проверки оказалось что при быстрой отправке уже сервер получает пакет непрвильного размера, хотя на клиенте перед выполнением метода Send размер был верным. Возможно уже не вижу очевидных вещей. Подскажите в чём проблема?

_>Вот частичный код сервера:


skipped[]

_>Буду очень признтелен за помошь. Задачу очень нузно решить


Данные при передаче буфферизуются. Поэтому Socket.Receive (или EndReceive) прчитает столько байт, сколько у него на данный момент есть в буфере. Данные, переданные с клиента одним Socket.Send могут приниматься на другой стороне несколькими Socket.Receive. Об этом надо помнить.
Если ты передаешь в один сокет не сплошной поток байт, а логически отдельные части, тебе следует предпринять специальные меры, чтобы правильно разделить принимаемый поток на другой стороне.
Например сначала можно посылать размер передаваемых данных (Int32 — 4 байта), а потом сами данные. На другой стороне ты сначала читаешь 4 байта, преобразуешь их в Int32 и видишь размер идущих следом данных. Выделяешь соотвтетствующий буфер и повторяешь Receive пока на прочитаешь их все.
Понедельник начинается в субботу
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.