2016-11-25 3 views
0

Предположим, что я подключен к кому-то, используя System.Net.Sockets.TcpClient. Я отправляю сообщение им, затем я сразу вызываю TcpClient.Close(); Получается ли другой клиент, чтобы получить сообщение? Кроме того, это правда/ложь в большинстве реализаций TCP?TCP - Отправка сообщения, затем отсоединение

+1

Вкратце - нет, это не гарантировано (кроме некоторых конкретных условий/использования) – Vlad

+0

Из любопытства, почему TCP через UDP, если вы ищете сообщение о пожаре и забыть? – ColinM

+0

@ColinM - Я делаю приложение для чата и пытаюсь найти лучший способ «кого-то». Я надеялся, что сервер может отправить сообщение о том, что человек был пнут X по причине Y, а затем сразу же закрыл соединение и отключил его. –

ответ

1

Комментарий Влада - доставка не гарантируется.

Предположим, что установлено соединение TCP с одноранговым узлом. Операция отправки просто копирует данные в сетевой стек в операционной системе, и на нее отвечает ОС. Вы закрываете операцию вызова. ОС не перестает отправлять предыдущие данные. ОС откладывает закрытие сокета до отправки данных. Он прозрачен с точки зрения приложения.

Но что-то не так. Несовпадение может привести к сбою, может произойти сбой сети или что-то еще. Хотя ОС пытается повторно передать данные, если TCP ACK не получен, повторная передача может снова и снова прерываться, пока ОС не сдастся. Этот общий механизм во всех ОС реализует протокол TCP.

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