2010-03-18 2 views
3

Вот сценарий с асинхронными сокетами, которые я не совсем понимаю ... У меня есть 2 Tcp сокета, клиентский сокет & - серверный сокет. Мой серверный сокет связан & прослушивание порта.C# Socket.BeginОтправить поведение AsyncCallback (timeout?)

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

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

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

Thanks

ответ

3

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

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

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

+0

Ждать, что? Начальный обратный вызов вызывается перед получением TCP ACK с сервера? Я не уверен, что мне это нравится. – Chris