Beispiel #1
0
 public void ReceiveHandler(ref SelectControl selectControl, Socket socket, Buf safeBuffer)
 {
     try
     {
         int bytesReceived = socket.Receive(safeBuffer.array);
         if (bytesReceived <= 0)
         {
             if (socket == client)
             {
                 if (AppLayerProxy.Logger != null)
                 {
                     AppLayerProxy.Logger.WriteLine("{0} > {1} Client Disconnected",
                                                    clientLogString, serverLogString);
                 }
                 selectControl.DisposeAndRemoveReceiveSocket(client);
                 selectControl.ShutdownIfConnectedDisposeAndRemoveReceiveSocket(server);
             }
             else
             {
                 if (AppLayerProxy.Logger != null)
                 {
                     AppLayerProxy.Logger.WriteLine("{0} > {1} Server Disconnected",
                                                    clientLogString, serverLogString);
                 }
                 selectControl.DisposeAndRemoveReceiveSocket(server);
                 selectControl.ShutdownIfConnectedDisposeAndRemoveReceiveSocket(client);
             }
         }
         else
         {
             if (socket == client)
             {
                 if (AppLayerProxy.Logger != null)
                 {
                     AppLayerProxy.Logger.WriteLine("{0} > {1} {2} bytes",
                                                    clientLogString, serverLogString, bytesReceived);
                 }
                 server.Send(safeBuffer.array, bytesReceived, SocketFlags.None);
             }
             else
             {
                 if (AppLayerProxy.Logger != null)
                 {
                     AppLayerProxy.Logger.WriteLine("{0} < {1} {2} bytes",
                                                    clientLogString, serverLogString, bytesReceived);
                 }
                 client.Send(safeBuffer.array, bytesReceived, SocketFlags.None);
             }
         }
     }
     catch (Exception)
     {
         selectControl.ShutdownIfConnectedDisposeAndRemoveReceiveSocket(client);
         selectControl.ShutdownIfConnectedDisposeAndRemoveReceiveSocket(server);
     }
 }
Beispiel #2
0
        void ServerSocketConnected(ref SelectControl selectControl, Socket serverSocket, Buf safeBuffer)
        {
            try
            {
                if (!clientSocket.Connected)
                {
                    clientSocket.Close(); // Should already removed from selectControl
                    if (!selectControl.ConnectionError && serverSocket.Connected)
                    {
                        if (AppLayerProxy.Logger != null)
                        {
                            AppLayerProxy.Logger.WriteLine("{0} > {1} Server Connected but Client Disconnected...Closing Server", clientLogString, serverLogString);
                        }
                        try { serverSocket.Shutdown(SocketShutdown.Both); }
                        catch (Exception) { }
                    }
                    else
                    {
                        if (AppLayerProxy.Logger != null)
                        {
                            AppLayerProxy.Logger.WriteLine("{0} > {1} Client disconnected before server could connect", clientLogString, serverLogString);
                        }
                    }
                    selectControl.DisposeAndRemoveConnectSocket(serverSocket);
                }
                else if (selectControl.ConnectionError)
                {
                    if (AppLayerProxy.Logger != null)
                    {
                        if (AppLayerProxy.ForwardProxy == null)
                        {
                            AppLayerProxy.Logger.WriteLine("{0} > {1} Failed to connect to server..Closing Client", clientLogString, serverLogString);
                        }
                        else
                        {
                            AppLayerProxy.Logger.WriteLine("{0} > {1} Failed to connect to proxy server '{2}'..Closing Client",
                                                           clientLogString, serverLogString, AppLayerProxy.ForwardProxy.host.CreateTargetString());
                        }
                    }
                    clientSocket.ShutdownAndDispose(); // Should already removed from selectControl
                    selectControl.DisposeAndRemoveConnectSocket(serverSocket);
                }
                else if (!serverSocket.Connected)
                {
                    // Ignore.  Only do something if we are connected or get a ConnectionError
                }
                else
                {
                    if (AppLayerProxy.Logger != null)
                    {
                        AppLayerProxy.Logger.WriteLine("{0} > {1} Connected to Server", clientLogString, serverLogString);
                    }

                    if (isConnect)
                    {
                        if (clientBuffer == null)
                        {
                            FinishConnection(null, 0, 0);
                        }
                        else
                        {
                            uint extraChars = clientBuffer.contentLength - headersLength;
                            FinishConnection(clientBuffer.bytes, headersLength, extraChars);
                        }
                    }
                    else
                    {
                        // A NonConnect will always have buffered data to send
                        FinishConnection(clientBuffer.bytes, 0, clientBuffer.contentLength);
                    }

                    TcpBridge bridge = new TcpBridge(clientLogString, clientSocket, serverLogString, serverSocket);
                    selectControl.AddReceiveSocket(clientSocket, bridge.ReceiveHandler);
                    selectControl.UpdateConnectorToReceiver(serverSocket, bridge.ReceiveHandler);
                }
            }
            catch (Exception e)
            {
                if (AppLayerProxy.ErrorLogger != null)
                {
                    AppLayerProxy.ErrorLogger.WriteLine("{0} > {1} Failed to finish connection: {2}", clientLogString, serverLogString, e.Message);
                }
                selectControl.ShutdownIfConnectedDisposeAndRemoveReceiveSocket(clientSocket);
                selectControl.ShutdownIfConnectedDisposeAndRemoveReceiveSocket(serverSocket);
                selectControl.DisposeAndRemoveConnectSocket(serverSocket);
            }
        }