#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", ...)
Это должно исправить это