C # ==> Буфер чтения Asyncsocket? - PullRequest
       6

C # ==> Буфер чтения Asyncsocket?

0 голосов
/ 17 августа 2010

У меня есть сервер C #, который принимает несколько клиентов и несколько сообщений от каждого клиента.

1- Чтобы начать чтение с каждого клиента, мне нужно передать буфер (байты), но проблема в том, что я не знаю, сколько данных собирается отправить клиент. Так есть ли способ узнать, сколько данных собирается отправить клиент, чтобы я мог начать чтение для правильного объема данных?

2 - Хорошо, если я использую только 1 байтовый массив для чтения со всех клиентов? или мне нужно создать байтовый массив для чтения с каждого клиента?

Ответы [ 2 ]

2 голосов
/ 17 августа 2010
  1. Если ваш протокол не определяет, сколько данных будет отправлено, нет. Обычно вы читаете ценность одного буфера, а затем потенциально читаете больше. Это будет зависеть от протокола. Если клиент может отправлять только одно сообщение по каждому соединению, вы обычно продолжаете чтение, пока следующий вызов не вернет 0 байт. В противном случае либо сообщения имеют разделители, либо префикс длины.

  2. Абсолютно нет - при условии, что вы собираетесь читать с нескольких клиентов одновременно (почему бы вам не использовать асинхронную связь?), Вы получите все данные разных клиентов, записываемые друг на друга. Создайте новый байтовый массив для каждого клиента. В зависимости от того, что именно вы делаете с данными, вы можете повторно использовать тот же байтовый массив для следующего чтения для того же клиента - и вы можете повторно использовать байтовый массив для более поздних клиентов, если вы действительно этого хотите. ... но не читать с нескольких клиентов одновременно в один и тот же буфер.

0 голосов
/ 17 августа 2010

Так есть ли способ узнать, сколько данных собирается отправить клиент, чтобы я мог начать чтение для правильного объема данных?

Любой протокол должен иметь некоторыемеханизм, позволяющий клиенту указывать, когда он завершил отправку данных, либо в виде значения «длины», которое отправляется до фактических данных, либо в виде специальной завершающей последовательности, которая отправляется после данные.

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

Зависит от того, как работает ваша программа.Если у вас будет несколько одновременно работающих клиентов, очевидно, что у вас не может быть только одного буфера, потому что они в конечном итоге будут перезаписывать друг друга.Если это один клиент за другим, но только один за раз, нет проблем с наличием только одного буфера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...