«Исключение SocketException: такой хост не известен» при подключении к порту на локальном хосте

#c# #.net #tcpclient

#c# #.net #tcpclient

Вопрос:

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

Вот соответствующий фрагмент кода:

 public static class Server
{
    public const string LocalHost = "http://127.0.0.1";
    public const int Port = 31311;
    public static readonly string FullAddress = $"{LocalHost}:{Port}";

    private static readonly TimeSpan RetryConnectionInterval = TimeSpan.FromSeconds(10);

    public static async Task AwaitStart()
    {
        try
        {
            TcpClient tcpClient = new TcpClient();
            ConnectionState connectionState = new ConnectionState(tcpClient);

            tcpClient.BeginConnect(
                host: HostAddress, 
                port: Port,
                requestCallback: PingCallback,
                state: connectionState);

            bool startedSuccessfully = connectionState.IsSuccess;

            while (!startedSuccessfully)
            {
                await Task.Delay(RetryConnectionInterval);
                startedSuccessfully = connectionState.IsSuccess;
            }
        }
        catch (Exception exception)
        {
            Console.WriteLine(exception.Message);
        }
    }

    private static void PingCallback(IAsyncResult result)
    {
        ConnectionState state = (ConnectionState)result.AsyncState;

        try
        {
            state.TcpClient.EndConnect(result);
            state.IsSuccess = true;
            Console.WriteLine("The server is successfully started.");
        }
        catch (SocketException)
        {
            Console.WriteLine($"The server is not yet started. Re-attempting connection in {RetryConnectionInterval.Seconds} seconds.");

            Wait(RetryConnectionInterval).GetAwaiter().GetResult();
            state.TcpClient.BeginConnect(host: HostAddress, port: Port, requestCallback: PingCallback, state: state);
        }
    }

    private static async Task Wait(TimeSpan duration)
    {
        await Task.Delay(duration);
    }
}

public class ConnectionState
{
    public bool IsSuccess;
    public readonly TcpClient TcpClient;

    public ConnectionState(TcpClient tcpClient)
    {
        this.TcpClient = tcpClient;
    }
}
 

Исключение перехватывается внутри catch предложения in PingCallback(IAsyncResult result) с сообщением об ошибке «Такой хост не известен».

Когда я запускаю netstat -an , я вижу, что мой локальный сервер действительно прослушивает порт 31311:

введите описание изображения здесь

Если я переключусь TcpClient tcpClient = new TcpClient(); на TcpClient tcpClient = new TcpClient(LocalHost, Port); , вместо этого там будет выдано то же исключение (с тем же сообщением об ошибке).

Как я могу исправить эту проблему?

Комментарии:

1. Вы должны указывать 127.0.0.1 в качестве локального хоста, а не http://127.0.0.1

2. @Vikhram Спасибо! Я как-то упустил это из виду. Лишение сна — это не шутка 😉

Ответ №1:

Неправильно указано имя хоста. У вас должен быть вызов, подобный приведенному ниже, когда вы пытаетесь выполнить его без асинхронности.

 TcpClient tcpClient = new TcpClient("127.0.0.1", 31311);
 

в асинхронном соединении вы должны указать, как показано ниже

 tcpClient.BeginConnect(host: "127.0.0.1", ...)
 

Это должно исправить это