Здравствуйте, 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 на сервере — читая то что ещё не пришло до конца?? Или я просто читаю на сервере конец прошлого и начало нового пакета как единое целое???
Подскажите пожалйста.