C # Socket.BeginSend AsyncCallback поведение (время ожидания?) - PullRequest
3 голосов
/ 19 марта 2010

Вот сценарий с асинхронными сокетами, который я не совсем понимаю ... У меня есть 2 сокета Tcp, сокет клиента и сокет сервера. Мой серверный сокет связан и прослушивает порт.

Мои клиентские сокеты подключаются к сокету сервера (используя BeginConnect / EndConnect). Затем я отправляю сообщение на сервер с помощью BeginSend (). На стороне сервера я не делаю Receive () или BeginReceive ().

Что происходит, так это то, что мой AsyncCallback, указанный для моего вызова BeginSend, вызывается, и его IAsyncResult сообщает мне, что он завершен, и вызов Socket.EndSend () не вызывает никакого исключения ...

Есть ли что-то, чего я не получаю или не должен вызываться мой AsyncCallback, только если вызов BeginSend действительно что-то отправляет на сервер (т. Е .: обратный вызов вызывается после того, как сервер получил все байты)? Если на сервере не было получено ни одного сообщения, не должен ли быть вызван мой обратный вызов после истечения времени ожидания, а мой вызов Socket.EndSend вызовет исключение?

Спасибо

1 Ответ

3 голосов
/ 19 марта 2010

Нет, TCP / IP обрабатывает все это для вас. На обеих сторонах соединения находятся буферы, которые будут хранить данные до тех пор, пока они не будут получены. Без буферизации, вероятно, будет ужасная задержка при отправке болтливого сообщения.

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

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

...