почему приемник TCP может получать данные после выключения Socket Server? - PullRequest
1 голос
/ 02 декабря 2010

Я использую Java для реализации многопоточного приложения TCP-сервер-клиент.Но теперь я столкнулся со странной проблемой: когда я выключаю серверный сокет, получатель может непрерывно получать последний отправленный пакет.Поскольку детали чтения сокетов относятся к ядру, я не могу понять причину.Кто-нибудь может дать какое-нибудь руководство?Заранее спасибо!Редактировать: соответствующий код прост:

public void run() {
  while(runFlag) {
      //in = socket.getSocketInputStream();
      //byte[] buffer = new byte[bufferSize]; 
      try {
          in.read(buffer);
          //process the buffer;
      }catch(IOException e) {
          //
      }
  }
}

при выключении сокета сервера, эта операция чтения будет получать пакет постоянно (каждый раз, когда входит в цикл while).

Ответы [ 3 ]

3 голосов
/ 02 декабря 2010

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

2 голосов
/ 02 декабря 2010

Если данные уже находятся в буфере клиентского сокета (на уровне ядра, ожидая, пока ваше приложение прочитает их в память пространства пользователя), сервер не сможет предотвратить их чтение. Это похоже на обычную почту: после того, как вы ее отправили, вы не можете ее отменить.

0 голосов
/ 02 декабря 2010

Вот так работает TCP.Это надежный поток байтов.Недоставленные данные продолжают доставляться после нормального закрытия.Разве это не то, что вы хотите?Почему это «проблема»?

...