Асинхронно отправлять / получать фиксированный объем данных с использованием сокета TCP - PullRequest
2 голосов
/ 10 февраля 2011

В моем приложении я выполняю асинхронную связь через TCP-сокет.

Мне не нравится тот факт, что операции отправки и получения (синхронизация или асинхронность) класса Socket могут завершаться до того, как будет передано запрошенное количество байтов. Например: когда я хочу прочитать X байтов из сокета, я не хочу заботиться о том, сколько операций чтения эффективно необходимо для достижения этого (в моей логике приложения). Я просто хочу получать уведомления, когда он закончится (или когда произошла ошибка).

Было бы неплохо иметь что-то вроде BeginSendFixed, EndSendFixed, BeginReceiveFixed и EndReceiveFixed. Они будут вести себя точно так же, как BeginSend, EndSend, BeginReceive, EndReceive, но не будут вызывать обратный вызов до того, как будет передано запрошенное количество байтов.

Я думаю о том, чтобы реализовать это самостоятельно, основываясь на:

http://msdn.microsoft.com/en-us/magazine/cc163467.aspx

В функции DoTaskHelper я бы вызывал столько (синхронно) Send или Receive, пока все данные не будут переданы.

Это путь или есть другой (лучший) способ скрыть необходимость множественных отправок / приемов от логики моего приложения?

1 Ответ

0 голосов
/ 10 февраля 2011

Я рекомендую для этого использовать класс TaskCompletionSource. Это имеет преимущество в том, что не записывает поток, просто ожидая ввода-вывода. Вероятно, было бы проще обернуть существующие (асинхронные) API сначала как Task, а затем создать свой API, используя TaskCompletionSource.

Обратите внимание, что TaskCompletionSource был добавлен в .NET 4. Если вы еще не на этой платформе, то я рекомендую направить подпрограммы завершения в поток пользовательского интерфейса (что легко сделать с помощью сокета асинхронного шаблона на основе событий обертки в Nito.Async.Sockets ), а затем помещают их через анализатор, специфичный для вашего протокола (пример которого в моем блоге ).

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