Прокси-сервер, использующий сокеты .net

#c# #sockets #proxy

#c# #сокеты #прокси

Вопрос:

Я пишу прокси-сервер и использую его для сокетов. Проблема в том, как определить конец данных и закрыть сокет или понять, как это делает браузер.

Мой прокси-сервер очень прост, он просто пересылает запросы с использованием определенного сетевого адаптера на прокси-сервер интрасети, поэтому синтаксический анализ запросов отсутствует, а SSL не требует дополнительной аутентификации.

 public void Start(IPEndPoint local, IPEndPoint remote) {
    _mainSocket.Bind(local);
    _mainSocket.Listen(100);
    while (true) {
        var source = _mainSocket.Accept();
        var destination = new TcpForwarder();                
        var state = new State(source, destination._mainSocket, localSockets);
        destination._mainSocket.Bind(new IPEndPoint(IPAddress.Parse("10.94.136.231"), 0));
        destination.Connect(remote, source);
        source.BeginReceive(state.Buffer, 0, state.Buffer.Length, 0, OnDataReceive, state);
    }
}

private void Connect(EndPoint remoteEndpoint, Socket destination) {
    var state = new State(_mainSocket, destination, local, destinationstate);
    _mainSocket.Connect(remoteEndpoint);
    _mainSocket.BeginReceive(state.Buffer, 0, state.Buffer.Length, SocketFlags.None, OnDataReceive, state);
}
 

OnDataReceive
просто прочитает все, отправит в другой сокет и продолжит прослушивание

Но для каждого запроса создается другое соединение с сокетом, и я не знаю, когда я смогу его закрыть, даже если я закрою браузер, оба сокета по-прежнему имеют статус подключения, и они остаются навсегда, поскольку этот прокси локальный, я могу перезапустить все, когда произойдет сбой, но, тем не менее, я хочу понять, как запросыработа, разве запрос TCP / IP не такой же, как открыть сокет и отправить определенные заголовки?

Комментарии:

1. TCP — это сетевой транспортный уровень, в то время как браузер имеет прикладной уровень, использующий http над уровнем TCP. Метод определения EOM в http использует теги. Обычно в msdn класс сокетов, который наследует TCP, имеет лучшую документацию. См. msdn.microsoft.com/en-us/library /…

Ответ №1:

похоже, что если я закрою сокет, если не было получено никаких данных, этого будет достаточно, браузер получит все, что требуется, и утечки не будет, поэтому я предполагаю, что это правильный путь, было странно, что если я просто получу файл изображения, то сокет останется подключенным в течение некоторого времени

 var bytesTransferred = state.SourceSocket.EndReceive(readSocket);
if (bytesTransferred == 0)
{
    state.SourceSocket.Close();
    state.DestinationSocket.Close();
}