2009-10-20 5 views
2

Мое задание довольно простое и связано с асинхронными сокетами, работающими с протоколом TCP.Обратные вызовы с использованием асинхронных сокетов

Когда я отправляю данные с помощью метода «BeginSend», когда будет вызван обратный вызов?

Будет ли он вызываться, когда данные просто отправляются в сеть, или когда мы гарантируем, что данные достигли своего адресата (как и в отношении спецификации TCP)?

Спасибо за ваши ответы.

KiTe.

ps: Извините, если мой английский немного плохой ^^.

ответ

3

Из MSDN:

«Когда приложение вызывает BeginSend, система будет использовать отдельный поток для выполнения указанного метода обратного вызова, и будет блокировать на EndSend, пока гнездо не посылает количество байт, запрошенных или бросает исключение «.

«Успешное завершение отправки не означает, что данные были успешно доставлены. Если в транспортной системе нет доступного пространства для хранения данных, которые будут переданы, отправка будет заблокирована, если сокет не был помещен в неблокирующий Режим."

http://msdn.microsoft.com/en-us/library/38dxf7kt.aspx

+0

Обратите внимание, что это отличается от BeginReceive/EndReceive. – Jess

3

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

Из-за природы протокола TCP вы можете быть уверены (ну, я думаю, почти наверняка), что в конечном итоге он достигнет цели.

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

+0

ОК, спасибо вам обоим, это именно то, что я искал. – KiTe

+0

добро пожаловать .. –