2009-09-09 3 views
0

Я пишу сервер и должен иметь возможность отправлять сообщение всем подключенным клиентам.Когда будет отправлен SendAsync?

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

Другим подходом было бы использование одного SocketAsyncEventArgs и отправка пакетов один за другим. Тогда было бы заманчиво вызывать SendAsync в методе ProcessSend (который вызывается, когда SendAsync завершен) и иметь очередь подключенных сокетов. Но что, если по какой-то причине SendAsync не завершится за разумное время? Есть ли какой-нибудь сценарий, который бы никогда не завершился?

ответ

0

SendAsync немедленно вернется. Если вы говорите о самой операции отправки, это не будет никогда не, но это может занять много времени, если сокет находится в ненормальном состоянии.

+0

Да, я знаю, что метод всегда возвращается немедленно. Но если время до того, как вызывается обработчик события Completed, может быть длинным, тогда было бы небезопасно иметь очередь отправки и повторно использовать те же SocketAsyncEventArgs. – remdao

+0

Это может занять много времени (дольше обычного, в любом случае), если есть перегрузка сети; или если это протокол потока гарантированного доставки, я думаю, что это может занять много времени, если приемник медленно считывает предыдущие данные (чтобы сетевые буферы соединения были полными и контролировались потоком). – ChrisW

+0

@remdao: Вы должны предположить, что SendAsync может занимать больше времени, чем вы хотели бы, и соответствующим образом кодировать. Почти в каждом случае ваше полное событие произойдет очень быстро, но вы не можете рассчитывать на это. –

Смежные вопросы