#c# #.net #network-programming #uwp
#c# #.net #сетевое программирование #uwp
Вопрос:
У меня проблема с получением большого объема данных из StreamSocket в нашем клиенте W10. Во время тестирования одного из наших пакетов в нашем протоколе возникла проблема с десериализацией данных. Было обнаружено, что данные были вырезаны и имели 260B, хотя в определении пакета указано, что он должен содержать больше данных. Тестирование того же пакета на нашем клиенте Windows Phone 8 с тем же вводом дало больше данных (около 26 КБ), чем у клиента w10. На сервере было проверено, что одинаковый объем данных отправляется обоим клиентам.
Первая попытка решения заключалась в увеличении DataReader.LoadAsync()
буфера до 10 МБ, но был получен все тот же небольшой объем данных. Затем я проверил соединение с помощью WireShark и выяснил, что все данные принимаются Windows, но только часть их используется клиентом. Следующая попытка решить проблему заключалась в использовании DataReader.LoadAsync в цикле, но он останавливается на гораздо меньших пакетах. В этот момент было обнаружено, что остальные данные для пакета могут быть прочитаны впоследствии. Затем Task.Delay(1000)
был использован. Это сработало, и все данные были получены, но это не очень хорошее решение. Я искал StackOverflow, форумы Microsoft и Google, но решения нет. Предложения StackOverflow по этому вопросу не отвечают на проблему.
Через некоторое время я попытался прочитать из StreamSocket.InputStream
буфера в цикле фиксированным количеством байтов и использовать StreamSocket.InputStream.ReadAsync
все возможные комбинации параметров. Он работал с параметром InputStreamOptions.Partial
и InputStreamOptions.None
, но он остановился на ReadAsync, когда достиг конца пакета. Я также использовал StreamSocketListener
with StreamSocket
, но это тоже не сработало.
Вопрос в том, каковы методы получения большого объема данных с использованием StreamSockets и DataReader?
Комментарии:
1. Серверы часто ограничивают объем данных примерно 10 МБ. Таким образом, вы можете просто иметь дело с ограничением операционной системы, которое можно изменить. Часто, чтобы обойти ограничения, мне приходилось разделять файлы для отправки, а затем рекомбинировать. Я сталкивался с подобными проблемами в течение 40 лет. В Unix есть хорошая команда split(), которая была создана как раз для таких проблем.
2. Это не относится к слишком большим данным. С сервера в программе я получил около 250 байт. После того, как я приостановил задачу на секунду перед получением данных, она составила около 26 КБ.
3. Асинхронные данные могут поступать не все одновременно. Вы должны указать, где фактически заканчиваются данные. Обычно используется один (или несколько) из следующих методов: 1) Ascii: завершает каждое сообщение знаком, который не является частью сообщения 2) Ascii или двоичный код: добавляет количество байтов к началу сообщения 3) Ascii или двоичный код: сообщения фиксированной длины. Поток не имеет конца, и приложение должно определить алгоритм, который определяет конец каждого сообщения / данных.