C # Socket работает локально, но не удаленно - PullRequest
0 голосов
/ 28 февраля 2019

У меня есть клиент C # и отдельное серверное приложение.Когда я выполняю оба на одной машине, я могу подключиться к серверу.Однако, когда я пытаюсь подключиться к своему серверу удаленно, это всегда заканчивается тайм-аутом.Я использую порт 139, и я попытался запустить серверное приложение на нескольких компьютерах.Я пробовал это на сервере, который открыт для общественности, на моем частном ПК с маршрутизатором, пересылающим этот порт на ПК, а также на ноутбуках в той же сети.Я всегда проверял, прослушивает ли компьютер, на котором работает сервер, порт netstat -an и делал исключения в брандмауэре для всех из них.Код, который я использую на клиенте для подключения к серверу:

 static IPHostEntry ipHostInfo = Dns.GetHostEntry("xxx.xxx.xxx.xxx");               
 static IPAddress ipAddress = ipHostInfo.AddressList[0];                             
 static IPEndPoint remoteEP = new IPEndPoint(ipAddress, port);                       
 static Socket client = new Socket(ipAddress.AddressFamily,                          
     SocketType.Stream, ProtocolType.Tcp);

static private void ConnectToServer()
    {
        try
        {
            client.BeginConnect(remoteEP,
                   new AsyncCallback(ConnectCallback), client);
            connectDone.WaitOne();
        }
        catch (Exception ex)
        {
            Console.WriteLine("Error: ", ex.ToString());
        }
    }

private static void ConnectCallback(IAsyncResult ar)
    {
        try
        {
            // Retrieve the socket from the state object.  
            Socket client = (Socket)ar.AsyncState;

            // Complete the connection.  
            client.EndConnect(ar);

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

            // Signal that the connection has been made.  
            connectDone.Set();
        }
        catch (Exception e)
        {
            Console.WriteLine(e.ToString());
        }
    }

Код, который я использую для подтверждения соединения на сервере:

 static IPHostEntry ipHostInfo = Dns.GetHostEntry(Dns.GetHostName());
 static IPAddress ipAddress = ipHostInfo.AddressList[0];
 static IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 139);
 static Socket listener = new Socket(ipAddress.AddressFamily,
    SocketType.Stream, ProtocolType.Tcp);

    try
        {
            listener.Bind(localEndPoint);
            listener.Listen(100);

            while (true)
            {
                allDone.Reset();
                Console.WriteLine("Listening on: " + ipAddress);
                listener.BeginAccept(
                    new AsyncCallback(AcceptCallback),
                    listener);
                allDone.WaitOne();
            }
        }
        catch (Exception e)
        {
            Console.WriteLine(e.ToString());
        }

static void AcceptCallback(IAsyncResult ar)
    {
        allDone.Set();
        Socket listener = (Socket)ar.AsyncState;
        Socket handler = listener.EndAccept(ar);

        StateObject state = new StateObject();
        state.workSocket = handler;
        handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,
            new AsyncCallback(ReadCallback), state);
    }

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

Любая помощь приветствуется, спасибо.

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