2016-10-14 10 views
0

私はプロキシサーバーを作成してソケット用に使用しています。問題は、データの終わりを検出してソケットを閉じる方法、またはブラウザがその動作をどのようにしているかを理解することです。ソケットを使用するプロキシサーバー。

私のプロキシは非常に簡単です。特定のネットワークアダプタを使用してリクエストをイントラネットプロキシに転送するだけなので、リクエストの解析は行われず、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 ちょうど私が閉じても、すべてが別のソケットに送信読み、

を聴き続けるしかし、リクエストごとに別のソケット接続がなされ、そして、私はそれを閉じることができたとき、私は知りませんブラウザは両方のソケットがまだConnectedステータスを持っていて、それらは永遠に残っています。このプロキシはローカルなので失敗しましたが、依然としてリクエストの仕組みを理解したい、TCP/IP要求がオープンソケットと同じで、ヘッダー?

+0

TCPはネットワークトランスポート層で、ブラウザにはTCP層の上にhttpを使用するアプリケーション層があります。 httpでEOMを決定する方法はタグを使用します。通常、msdnには、TCPが継承するソケットクラスがあります。 https://msdn.microsoft.com/en-us/library/system.net.sockets.socket.begindisconnect(v=vs.110).aspxを参照してください。 – jdweng

答えて

0

データが受信されなかった場合、私はソケットを閉じても十分ですが、ブラウザは必要なものすべてを受信し、リークはありませんので、正しい方法だと思います。ソケットはしばらくの間接続されています。

var bytesTransferred = state.SourceSocket.EndReceive(readSocket); 
if (bytesTransferred == 0) 
{ 
    state.SourceSocket.Close(); 
    state.DestinationSocket.Close(); 
} 
関連する問題