C # асинхронный метод beginsend - PullRequest
0 голосов
/ 19 апреля 2010

Я новичок в программировании сокетов. Я разрабатываю серверное клиентское приложение.
И я использую асинхронный IP-сокет TCP. Но сейчас я столкнулся с проблемой. На стороне клиента я получаю свои данные с помощью массива байтов 2 КБ методом beginReceive. Он отлично работает, если размер данных меньше или равен 2 КБ, но проблема возникает, когда размер данных превышает 2 КБ.
Пожалуйста, дайте мне какое-то решение.

Ответы [ 2 ]

1 голос
/ 19 апреля 2010

Я согласен с ответом Джона, несмотря на то, что не следует ожидать, что все ваши данные будут прочитаны за один раз.

Вот некоторые блоги, которые помогли мне с этой проблемой в прошлом: Aviad Ezra имеет отличную серию по асинхронным сокетам:

Этот блог особенно полезен, если вы решили пойти по маршруту с префиксом длины, Автор использует MemoryStream в качестве своего временного хранилища между чтениями:

1 голос
/ 19 апреля 2010

Это совершенно нормально - вы не должны ожидать, что получите все данные за один вызов, используете ли вы синхронные или асинхронные вызовы, много ли у вас данных или мало.

Вы должны продолжать чтение, пока вызов read не покажет, что данных больше нет - или пока у вас не будет все, что вам нужно. Если вашему протоколу требуется более одного запроса / ответа на соединение, вы должны либо префиксировать длину каждого сообщения, чтобы другая сторона знала, сколько нужно прочитать, либо иметь какой-либо разделитель для указания конца сообщения. Префикс длины намного проще, когда он подходит, но он не поддерживает потоковую передачу - вам нужно получить префиксы с префиксом длины и последний фрагмент, чтобы указать, когда вы закончите.

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