Получить все данные, если соединение закрыто раньше - PullRequest
0 голосов
/ 18 марта 2012

У меня есть клиент, который подключается к серверу, начинает отправлять двоичные данные, а когда он завершает отправку, он закрывает соединение.Если соединение закрыто, сервер знает, что клиент завершил отправку файла.

У меня есть простой класс TCP для обработки соединения.Затем у меня есть другая функция, которая отправляет данные на сервер:

  TcpC tcp = new TcpC();

  void send_data_to_server(){
        tcp.connect();

        while(read_data){
            tcp.sendData();
        }

        Thread.Sleep(500);
        tcp.disconnect();
  }

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

Серверу придется обрабатывать много подобных операций, и я не могу позволить использовать Sleep () 'hack' для его работы.Иногда это все равно не работает, и я должен установить интервал сна на пару секунд, чтобы быть уверенным.Ни одна из других асинхронных функций на стороне сервера не вызывает исключение, кроме WaitForData ().

Как я могу немедленно закрыть соединение и при этом получить все данные?Хотя tcp.disconnect вызывается после того, как все данные все равно отправлены, я не понимаю, почему у меня возникла эта проблема.Спасибо!

1 Ответ

2 голосов
/ 18 марта 2012

Из документов MSDN:

Чтобы все данные были отправлены и получены до закрытия сокета, перед вызовом метода Disconnect следует вызвать Shutdown.

Возможно, стоит попробовать сделать это.

В противном случае, если в вашем фрагменте кода есть какие-либо указания (основанные на использовании TcpC), вам, вероятно, следует использовать TcpClient.Close, который, я полагаю, сделает это длявы.

...