Re[4]: Быстрая пересылка через Socket
От: impure_soul Россия  
Дата: 10.10.07 15:01
Оценка:
Здравствуйте, stump, Вы писали:

S>Очень просто. Ты передаешь в Send буфер размером 64К. Сокет начинает передавать эти данные, а другой сокет начинает принимать. Принимающий сокет складывает все принятое в буфер. В это время ты вызываешь Receive и сокет отдает тебе все что есть у него в буфере (допустим 12К). Он не ждет пока придут все 64К потому, что все происходит асинхронно. Он даже не знает что ему должны передать 64К.


Отсюда следует, что я впринципе не могу корректно передавать поток данных асинхронно!
Иначе как я смогу получить все отправленные данные в асинхронной модели?
Получается что я не должен вызвыать BeginReceive до тех пор пока не буду уверен что клиент закончил отправку данных?
Тогда в чём смысл асинхронной модели если все методы BeginXXX EndXXX только позволят читать в другом потоке и всё.
В таком случае как вообще пользоваться методами BeginReceive и EndReceive если мне нужно получить все данные отправленные пользователем. Насколько я понял написанное у Рихтера на каждый метод BeginReceive обязательно должен быть вызван EndReceive, который вернёт сами прочитанные данные и их количество. Тоесть само получение данных возможно только после вызова EndReceive. Тогда в какой момент мне нужно прочитать первые четыре байта размера и начинать читать до конца??? И почему тогда после устаноки задержки

 for (int i = 0; i < segmentCount; i++)
            {
                MyMessageType _message = new MyMessageType();
              
                int bytesToCopy = (int)stream.Length - sourceIndex;
                if (bytesToCopy > MAX_DATA_LEN) bytesToCopy = MAX_DATA_LEN;

                _message.DataContainer = r.ReadBytes(bytesToCopy);
                sourceIndex += bytesToCopy;

                MemoryStream mstream = new MemoryStream();
                BinaryFormatter serializer = new BinaryFormatter();
                serializer.Serialize(mstream, _message);
                byte[] buf = mstream.ToArray();
                try
                {
                    client.Send(buf, 0, buf.Length, SocketFlags.None);
                }
                catch { }
                Thread.Sleep(100); // << Вот та самая задержка. Если её убрать,
                                  // то возникает описанная проблема
            }


все данные приходят нормально?

Какая именно операция мне портит данные в буфере, Send на клиенте — перезаписывая ещё непрочитанные данные или Receive на сервере — читая то что ещё не пришло до конца?? Или я просто читаю на сервере конец прошлого и начало нового пакета как единое целое???

Подскажите пожалйста.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.