Сокет-серверы, SocketAsyncEventArgs и одновременные соединения в .Net - PullRequest
11 голосов
/ 23 февраля 2011

Я писал сокет-сервер на базе сервера CodeProject , который сам по себе взят из оригинального примера Microsoft .

В обоих случаях входящее сообщение немедленно возвращается отправителю, используя тот же SocketAsyncEventArgs . В моем случае мне нужно отправить входящее сообщение для дальнейшей асинхронной обработки перед ответом клиенту.

Проблема заключается в том, что возвращающийся ответ может попытаться использовать тот же SocketAsyncEventArgs одновременно с дальнейшим сообщением от клиента. Когда это происходит, я получаю это исключение:

"An asynchronous socket operation is already in progress using this SocketAsyncEventArgs instance"

Итак, (я считаю) мне нужен отдельный пул SocketAsyncEventArgs для сообщений, возвращающихся обратно. Пока все понятно.

Моя проблема в том, что я не уверен, как создать исходящий SocketAsyncEventArgs , поскольку он тесно связан с входящим.

Какую часть входящего я могу использовать повторно? например Если я просто укажу на тот же AcceptSocket, будут ли проблемы, когда сообщения будут перемещаться в обоих направлениях одновременно?

У кого-нибудь есть пример кода, как получить исходящий SocketAsyncEventArgs из входящего? Или я упускаю суть?

1 Ответ

3 голосов
/ 17 июля 2011

Эти объекты SocketAsyncEventArgs, вы можете использовать их по своему усмотрению. Они служат вам. И это почти только о Socket и буфере , которые они используют.

Таким образом, имея эту статью CodeProject в качестве примера, имеет смысл повторно использовать один и тот же экземпляр SAEA для SendAsync () сразу после получения целиком (возможно, состоящего из нескольких ReceiveAsync () звонков) завершено. Автор утверждает, что протокол таков: каждая из участвующих сторон отправляет и получает по очереди.

В вашем случае было бы проще просто выпустить экземпляр SAEA обратно в пул после завершения всего приема. Затем, после того, как вы закончили дополнительную обработку сообщений, вы можете выполнить совершенно новую операцию отправки, используя только что извлеченный из пула объект SocketAsyncEventArgs.

Другой вариант - просто передать SAEA, используемый операцией приема, от обратного вызова до обратного вызова во время асинхронной обработки, а затем, наконец, использовать его для отправки обработанного сообщения.

...