Серверы Socket, SocketAsyncEventArgs и параллельные соединения в .NET.

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

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

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

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

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

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

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

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

Ответ 1

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

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

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

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