c# Закрытие сокета

Я работаю над приложением HTTP-прокси, все работает нормально (клиент может подключиться к серверу и получить содержимое), проблема не в HTTP-сервере или браузере, закрывающих TCP-соединение. Я не уверен, что я делаю правильно, вот код:

while (tcp_link.Connected && _tcp.Connected && !ioError)
{
  try
  {
      Thread.Sleep(100);
      if (streamLink.DataAvailable)
      {
          byte[] l_buffer = new byte[10000];
          int l_read = streamLink.Read(l_buffer, 0, l_buffer.Length);
          byte[] l_data = new byte[l_read];
          Array.Copy(l_buffer, l_data, l_data.Length);

          _stream.Write(l_data, 0, l_data.Length);
      }

      if (_stream.DataAvailable)
      {
          byte[] c_buffer = new byte[10500];
          int c_read = _stream.Read(c_buffer, 0, c_buffer.Length);
          byte[] c_data = new byte[c_read];
          Array.Copy(c_buffer, c_data, c_data.Length);

          streamLink.Write(c_data, 0, c_data.Length);
      }
  }
  catch
  {
      ioError = true;
  }
}

У меня одинаковый код с обеих сторон (прокси-клиент и прокси-сервер)

ПРИМЕЧАНИЕ: браузер подключится к прокси-клиенту (который находится на том же компьютере), а прокси-клиент подключится к прокси-серверу, и, очевидно, прокси-сервер подключится к http-серверу, причина в том, что я не хочу кодировать данные перед их отправкой


person Shadow Walker    schedule 07.10.2012    source источник
comment
Вы можете рассмотреть возможность инициализации byte[] с помощью socket.Available. Этот код не дает представления о том, что вы пытаетесь сделать   -  person ray    schedule 07.10.2012


Ответы (2)


Как долго вы наблюдали открытое соединение?

Очень вероятно, что клиент использует HTTP 1.1, где постоянные подключения включены по умолчанию.

Если вы пишете прокси, вам следует рассмотреть: http://www.w3.org/Protocols/rfc2616/rfc2616-sec8.html

person Alastair McCormack    schedule 07.10.2012
comment
я использовал утилиты сетевого мониторинга, когда браузер подключается напрямую к http-серверу, соединение закрывается сразу после получения данных, поэтому это означает, что браузер или http-сервер закроют соединение, но когда браузер подключается к прокси-клиенту, я не могу обнаружить ни один запрос на закрытие с http-сервера на стороне прокси-сервера - person Shadow Walker; 07.10.2012

Хорошо, я нашел проблему, у кого когда-либо были проблемы с закрытием соединения сокета..

На самом деле, Socket.Available работает не так, как я ожидал, чтобы увидеть, действительно ли сокет подключен, вы должны проверить свойства «Доступно» и «Опрос», ниже функция должна решить вашу проблему: спасибо: zendar

bool SocketConnected(Socket s)
{
      bool part1 = s.Poll(1000, SelectMode.SelectRead);
      bool part2 = (s.Available == 0);
      if (part1 & part2)
            return false;
      else
            return true;
}

Я надеюсь, что это решит и вашу проблему;)

person Shadow Walker    schedule 07.10.2012