C # Невозможно подключиться к локальному хосту - PullRequest
1 голос
/ 02 ноября 2019

Я пишу очень простой .NET TCP Server и очень простой TCP Client, которые должны работать на одном компьютере (Windows 10 Home PC) и соединяться друг с другом (только для целей тестирования). На сервере я жду соединения следующим образом:

public static void StartListening()
{
    string hostname = Dns.GetHostName();
    IPHostEntry ipHostInfo = Dns.GetHostEntry(hostname);
    IPAddress ipAddress = ipHostInfo.AddressList[0];
    IPEndPoint localEndPoint = new IPEndPoint(ipAddress, Properties.Settings.Default.Port);

    Socket listener = new Socket(
        ipAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp);

    try
    {
        listener.Bind(localEndPoint);
        listener.Listen(Properties.Settings.Default.Port);

        while (true)
        {
            allDone.Reset();

            Console.WriteLine("Waiting for a connection...");
            listener.BeginAccept(
                new AsyncCallback(AcceptCallback),
                listener);

            allDone.WaitOne();
        }

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

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

public 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);

    var frames = Directory.EnumerateFiles(Properties.Settings.Default.FramesPath);

    foreach (string filename in frames)
    {
        Console.Write("Sending frame: {}...", filename);
        SendFile(handler, filename);
        Thread.Sleep(Properties.Settings.Default.FrameDelay);
    }
}

В клиенте я создаю соединение таким образом:

private void startClient(string host, int port)
{
    IPEndPoint serverEndPoint = new IPEndPoint(IPAddress.Parse(host), port);

    ClientTCP = new TcpClient();

    ClientTCP.Connect(serverEndPoint);

    Reader = new StreamReader(ClientTCP.GetStream());

    Listen = true;

    listner = Listener();
}

startClient называетсятаким образом.

startClient(txtAddr.Text, (int)int.Parse(txtPort.Text));

Когда я запускаю переменную клиента host для текущего имени машины (то же самое, что сервер извлекает через Dns.GetHostName() Я получил это исключение:

Указан неверный IP-адрес.

Я попытался использовать 127.0.0.1 и получил:

Соединение не может быть установлено. отклонение целевого компьютера 127.0.0.1:5002

Я пытался с localhost , и я получил

Указан неверный IP-адрес

снова. Я попытался с IP-адресом, назначенным для WiFi, и я получил снова

Не удалось установить соединение. Постоянное отклонение целевого компьютера 192.168.10.11:5002

Я уверен, что компьютерная сеть работает, так как я использую ее для многих других вещейвключая подключение к локальным службам TCP, и я уверен, что и клиентский, и серверный код работает, поскольку на другом ПК я могу подключить их, задав localhost в качестве значения переменной клиента host. Почему я не могу использовать петлевые соединения в своем коде?

Где произошел сбой?

PS Я разрешил соединение с двоичным файлом сервера в правилах брандмауэра Windows, я также разрешил исходящее соединение для двоичного файла клиентатакже.

Для тех, кто хочет проверить код сервера, вот он:

Код сервера

1 Ответ

3 голосов
/ 02 ноября 2019

Вы используете конструктор с параметром «IPEndPoint». Этот конструктор не подключается к серверу автоматически, и перед использованием сокета необходимо вызвать метод «Connect». Вот почему вы получаете сообщение об ошибке «Операция не разрешена для неподключенных сокетов». Кроме того, вы указали неверный IPEndPoint для клиента.
Пожалуйста, попробуйте это на клиенте:

private void startClient(string host, int port)
{
    IPEndPoint serverEndPoint = new IPEndPoint(IPAddress.Parse(host), port);

    ClientTCP = new TcpClient();

    ClientTCP.Connect(serverEndPoint);

    Reader = new StreamReader(ClientTCP.GetStream());

    Listen = true;

    listner = Listener();
}

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

ОБНОВЛЕНИЕ:
ipHostInfo.AddressList может иметь более одного адреса, и вам нужен только один из них. Это не обязательно первый. Я указал это вручную, и это работает:

//string hostname = Dns.GetHostName();
//IPHostEntry ipHostInfo = Dns.GetHostEntry("127.0.0.1");
//IPAddress ipAddress = ipHostInfo.AddressList[0];

IPAddress ipAddress = IPAddress.Parse("127.0.0.1");
IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 5002);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...