#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();
}