Нет ответа от сокета - PullRequest
       2

Нет ответа от сокета

0 голосов
/ 05 апреля 2019

Я построил сервер и клиент, которые общаются через сокеты.

Когда я запускаю сервер и клиент на одной машине, сервер и клиент получают ожидаемые сообщения.

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

Я удостоверился, что брандмауэр Windows и мой антивирус отключены на всех 3 компьютерах (2 физических и 1 виртуальная), чтобы не создавать проблем с безопасностью.

Соответствующий код выглядит следующим образом

SERVER

public class SynchronousSocketListener
    {

        // Incoming data from the client.  
        public static string data = null;

        public void StartListening()
        {
            InstructionProcessor instructionProcessor = new InstructionProcessor();

            // Data buffer for incoming data.  
            byte[] bytes = new Byte[1024];

            // Establish the local endpoint for the socket.  
            // Dns.GetHostName returns the name of the   
            // host running the application.  
            IPHostEntry ipHostInfo = Dns.GetHostEntry(Dns.GetHostName());
            IPAddress ipAddress = ipHostInfo.AddressList[0];
            IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 11000);

            // Create a TCP/IP socket.  
            Socket listener = new Socket(ipAddress.AddressFamily,
                SocketType.Stream, ProtocolType.Tcp);

            // Bind the socket to the local endpoint and   
            // listen for incoming connections.  
            try
            {
                listener.Bind(localEndPoint);
                listener.Listen(10);

                // Start listening for connections.  
                while (true)
                {
                    Console.WriteLine("Waiting for a connection...");
                    // Program is suspended while waiting for an incoming connection.  
                    Socket handler = listener.Accept();
                    data = null;

                    // An incoming connection needs to be processed.  
                    while (true)
                    {
                        int bytesRec = handler.Receive(bytes);
                        data += Encoding.ASCII.GetString(bytes, 0, bytesRec);
                        if (data.IndexOf("<EOF>") > -1)
                        {
                            break;
                        }
                    }

                    data = data.Substring(0, data.Length - 5);

                    // Show the data on the console.  
                    string response = instructionProcessor.doSomething(data);

                    // Echo the data back to the client.  
                    byte[] msg = Encoding.ASCII.GetBytes(response);

                    handler.Send(msg);
                    handler.Shutdown(SocketShutdown.Both);
                    handler.Close();
                }

            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
            }

            Console.WriteLine("\nPress ENTER to continue...");
            Console.Read();

        }


    }

КЛИЕНТ

public static string StartClient(string message, string ip)
{
    // Data buffer for incoming data.  
    byte[] bytes = new byte[1024];

    //Declare this at class scope level so it can be returned outside of try/catch blocks
    string response = null;

    // Connect to a remote device.  
    try
    {
        // Establish the remote endpoint for the socket.  
        // This example uses port 11000 on the local computer.  
        IPHostEntry ipHostInfo = Dns.GetHostEntry(ip);
        IPAddress ipAddress = ipHostInfo.AddressList[0];
        IPEndPoint remoteEP = new IPEndPoint(ipAddress, 11000);

        //string hostName = Dns.GetHostName();
        //string myIP = Dns.GetHostByName(hostName).AddressList[0].ToString(); ;

        //Debug.WriteLine( ipAddress );

        // Create a TCP/IP  socket.  
        Socket sender = new Socket(ipAddress.AddressFamily,
            SocketType.Stream, ProtocolType.Tcp);

        // Connect the socket to the remote endpoint. Catch any errors.  
        try
        {
            sender.Connect(remoteEP);

            Console.WriteLine("Socket connected to {0}",
                sender.RemoteEndPoint.ToString());

            // Encode the data string into a byte array.  
            byte[] msg = Encoding.ASCII.GetBytes(message + "<EOF>");

            // Send the data through the socket.  
            int bytesSent = sender.Send(msg);

            // Receive the response from the remote device.  
            int bytesRec = sender.Receive(bytes);
            Console.WriteLine("Echoed test = {0}",
                Encoding.ASCII.GetString(bytes, 0, bytesRec));

            response = Encoding.ASCII.GetString(bytes, 0, bytesRec);

            // Release the socket.  
            sender.Shutdown(SocketShutdown.Both);
            sender.Close();



        }
        catch (ArgumentNullException ane)
        {
            Console.WriteLine("ArgumentNullException : {0}", ane.ToString());
        }
        catch (SocketException se)
        {
            Console.WriteLine("SocketException : {0}", se.ToString());
        }
        catch (Exception e)
        {
            Console.WriteLine("Unexpected exception : {0}", e.ToString());
        }

    }
    catch (Exception e)
    {
        Console.WriteLine(e.ToString());
    }

    return response;
}

}

1 Ответ

0 голосов
/ 08 апреля 2019

Возможно, потому что клиент получает более 1024 байт.Попробуйте увеличить размер получаемого буфера.Также добавьте if (data.IndexOf ("")> -1) в клиентский проект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...