SocketException «подключенная сторона не ответила должным образом через некоторое время» при подключении к серверу с использованием публичного IP (C #) - PullRequest
0 голосов
/ 14 января 2019

Я пытаюсь создать сервер, используя C #. В настоящее время у меня есть две программы, сервер и клиент, обе из которых работают правильно, когда они работают на одном компьютере, сервер TcpListener создается с использованием ip 127.0.0.1 (localhost), и клиент подключается к ip 127.0.0.1. Однако, когда я пытаюсь подключиться к серверу, используя мой публичный ip, клиентская программа ждет около 20 секунд, а затем я получаю SocketException: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond

Я уже перенаправил порт, который я использую (порт 2345). Я попытался выполнить те же действия, что и выше, на другом компьютере, но все равно получил тот же результат. Я пытался использовать публичный ip при создании TcpListener сервера, но затем я получил SocketException: The requested address is not valid in its context, поэтому я предполагаю, что я должен просто использовать 127.0.0.1 (хотя я могу ошибаться, я впервые пытаюсь что-то подобное) .

Вот функция для создания сервера.

public static void RunServer()
{
    string ipStr = "";
    Console.WriteLine("Enter IP...");
    ipStr = Console.ReadLine();
    if (ipStr == "localhost")
        ipStr = "127.0.0.1";
    IPAddress ip = IPAddress.Parse(ipStr);

    int port = -1;
    Console.WriteLine("Enter port...");
    while (port == -1)
    {
        try
        {
            port = int.Parse(Console.ReadLine());
        }
        catch (FormatException)
        {
            Console.WriteLine("Please enter an integer.");
        }
    }
    Console.WriteLine("Starting server on " + ip + ":" + port);

    TcpListener tcpListener;
    try
    {
        tcpListener = new TcpListener(ip, port);
        tcpListener.Start();
    }
    catch (Exception e)
    {
        Console.WriteLine("Exception: " + e);
        Console.ReadLine();
        return;
    }

    while (true)
    {
        try
        {
            TcpClient tcpClient = tcpListener.AcceptTcpClient();

            NetworkStream networkStream = tcpClient.GetStream();

            StreamReader sr = new StreamReader(networkStream);
            string msg = sr.ReadToEnd();

            Console.WriteLine("Received message: \"" + msg + "\"");

            sr.Close();
            networkStream.Close();
            tcpClient.Close();
        }
        catch (Exception e)
        {
            Console.WriteLine("Exception: " + e);
        }
    }
}

И функция для создания клиента.

public static void RunClient()
{
    string ip = "";
    Console.WriteLine("Enter IP...");
    ip = Console.ReadLine();

    int port = -1;
    Console.WriteLine("Enter port...");
    while (port == -1)
    {
        try
        {
            port = int.Parse(Console.ReadLine());
        }
        catch (FormatException)
        {
            Console.WriteLine("Please enter an integer.");
        }
    }

    while (true)
    {
        Console.WriteLine("Enter message...");
        string msg = Console.ReadLine();
        Console.WriteLine("Sending message: \"" + msg + "\"");

        TcpClient tcpClient;
        try
        {
            tcpClient = new TcpClient(ip, port);
        }
        catch (SocketException e)
        {
            Console.WriteLine("Could not connect to server. Connection refused.");
            Console.WriteLine("Exception: " + e);
            continue;
        }

        NetworkStream networkStream = tcpClient.GetStream();

        networkStream.Write(Encoding.ASCII.GetBytes(msg), 0, msg.Length);
        Console.WriteLine("Sent message!");

        networkStream.Close();
        tcpClient.Close();
    }
}

Я думал, что то, что у меня сейчас есть, будет работать, но все, что я получаю, это исключение.

Ответы [ 2 ]

0 голосов
/ 15 января 2019

Проблема заключалась в том, что строка IPAddress ip = IPAddress.Parse(ipStr); серверной программы должна была быть IPAddress ip = IPAddress.Any;

0 голосов
/ 14 января 2019

Это потому, что брандмауэр вашего компьютера препятствует соединению. Во входящее правило вашего брандмауэра добавьте исключение для используемого вами порта.

...