예제 #1
0
        public CoreComm()
        {
            // reading config for servers' parameters
            IamServer server1 = new IamServer("127.0.0.1", 1578);

            servers.Add(server1);
            IamServer server2 = new IamServer("127.0.0.1", 1579);

            servers.Add(server2);
        }
예제 #2
0
        public void SendRequestToServer(IamServer server)
        {
            // Initialize socket between Proxy and Server
            P2SSocket = new TcpClient();
            // Create connection between Proxy and Server
            P2SSocket.Connect(IPAddress.Parse(server.IP), server.Port);
            NetworkStream P2SStream = P2SSocket.GetStream();

            StreamReader srP2S = new StreamReader(P2SStream);
            StreamWriter swP2S = new StreamWriter(P2SStream);
            StreamReader srC2P = new StreamReader(C2PStream);
            StreamWriter swC2P = new StreamWriter(C2PStream);

            // Get IP and port or client
            string clientIP   = ((IPEndPoint)C2PSocket.Client.RemoteEndPoint).Address.ToString();
            string clientPort = ((IPEndPoint)C2PSocket.Client.RemoteEndPoint).Port.ToString();
            // Get IP and port or server
            string serverIP   = ((IPEndPoint)P2SSocket.Client.RemoteEndPoint).Address.ToString();
            string serverPort = ((IPEndPoint)P2SSocket.Client.RemoteEndPoint).Port.ToString();
            // Response: * OK IMAP4rev1 Service Ready
            string response = srP2S.ReadLine();

            swC2P.WriteLine(response);
            swC2P.Flush();
            // Commands from client
            string msg = "";

            while (P2SSocket.Connected)
            {
                try
                {
                    // Read command from client
                    msg = srC2P.ReadLine();
                    // Sudden disconnection from client
                    if (msg == null)
                    {
                        break;
                    }
                    // Send Command to server
                    swP2S.WriteLine(msg);
                    swP2S.Flush();

                    var receiveBuffer = new byte[bufSize];
                    // Read response from server in bytes instead of sr.Readline
                    var count = P2SStream.Read(receiveBuffer, 0, bufSize);
                    response = Encoding.UTF8.GetString(receiveBuffer, 0, count);
                    // Return client the server response
                    swC2P.WriteLine(response.Trim());
                    swC2P.Flush();

                    // Commands with only tag
                    if (msg.Split(' ').Length == 1)
                    {
                        continue;
                    }
                    // Client call logout command
                    if ((msg.Split(' ')[1]).ToLower() == "logout")
                    {
                        break;
                    }
                }
                catch
                {
                    // Close streams
                    srP2S.Dispose();
                    srP2S.Close();
                    swP2S.Dispose();
                    swP2S.Close();
                    srC2P.Dispose();
                    srC2P.Close();
                    swC2P.Dispose();
                    swC2P.Close();
                    break;
                }
            }
            // Shutdown and end connection
            Console.WriteLine(clientIP + " : " + clientPort + " disconnected");
            C2PSocket.Close();
            Console.WriteLine("Disconnect with server " + serverIP + " : " + serverPort);
            P2SSocket.Close();
            // Close streams
            srP2S.Dispose();
            srP2S.Close();
            swP2S.Dispose();
            swP2S.Close();
            srC2P.Dispose();
            srC2P.Close();
            swC2P.Dispose();
            swC2P.Close();
        }