C # — Возможно ли отправить пакет TCP IP на мой собственный внешний IP-адрес для тестирования сервера?

#c# #networking #tcp

#c# #сеть #tcp

Вопрос:

)

Я создаю простое серверное приложение для отправки сообщений всем клиентам, которые подключились в определенное время. По сути, я запускаю сервер, который получает свой внутренний IP и порт и прослушивает. Затем на клиентах они подключаются к внешним IP и порту моих маршрутизаторов и отправляют tcp-пакет. Проблема в том, что мое клиентское приложение никогда не может успешно отправить пакет. Время ожидания истекло.

Вот код для сервера:

 ...
        try
        {
            server_listener = new TcpListener(IPAddress.Parse(192.168.0.xxx), 5000);
            server_listener.Start();
            isRunning = true;
            Console.WriteLine("[{0}] The server is now listening for all clients!", DateTime.Now);
            Listen();
        }

...



    void Listen()  // Listen to incoming connections.
    {
        while (isRunning)
        {
            TcpClient tcpClient = server_listener.AcceptTcpClient();  // Accept incoming connection.

            (new Thread(() => SetupAndListen(tcpClient))).Start(); //handle in a new thread
        }
    }
  

И клиент:

     //attempt to connect once...
    string textToSend = "CA";

    try
    {
        //---create a TCPClient object at the IP and port no.---
        TcpClient client = new TcpClient(EXTERNAL_SERVER_IP, 5000);
        NetworkStream nwStream = client.GetStream();
        byte[] bytesToSend = ASCIIEncoding.ASCII.GetBytes(textToSend);


        //---and see if connected---
        nwStream.Write(bytesToSend, 0, bytesToSend.Length);

        //---read back the text---
        byte[] bytesToRead = new byte[client.ReceiveBufferSize];
        int bytesRead = nwStream.Read(bytesToRead, 0, client.ReceiveBufferSize);
        Debug.Log("Received : "   Encoding.ASCII.GetString(bytesToRead, 0, bytesRead));
        client.Close();
    }
    catch { }
  

Сервер работает нормально, ошибок нет, и, судя по тому, что я вижу в отладчике, похоже, прослушивает должным образом, но ни один из моих клиентов не работает. Более того, если EXTERNAL_SERVER_IP изменить на localhost , или 192.168.0.xxx это фактически работает. Есть мысли относительно того, что происходит?

Просто отметим, что порт 5000 действительно был перенаправлен.

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

1. Это звучит как проблема с брандмауэром / сетевой маршрутизацией, а не проблема с кодированием, если вы можете использовать свой локальный IP-адрес для успешного подключения. Ваш модем / маршрутизатор / что бы вы ни использовали для подключения к Интернету, не настроен на разрешение трафика с вашего внешнего IP-адреса на компьютер, на котором запущена серверная программа. Возможно, вам повезет больше, если вы спросите serverfault.com прошу помощи в настройке вашей сети для выполнения того, что вы пытаетесь.

Ответ №1:

Вы пытаетесь отправить пакет на свой сервер изнутри своей сети, используя свой внешний IP? Это не будет работать со многими маршрутизаторами SoHo. Запрашиваемая вами функция маршрутизатора называется NAT Loopback.

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

1. Интересно… Поэтому разумно, что нет способа протестировать это внутренне. Я должен протестировать на других хостах?

2. Как вы могли бы проверить, правильно ли работает доступ к вашему серверу извне из любого другого места, кроме внешнего? Функциональность NAT маршрутизатора для пакетов, входящих из Интернета, является важной частью того, как это работает.

3. @DavidSchwartz можно проверить, поддерживает ли маршрутизатор обратную связь NAT, которая эмулирует это точно так, как если бы вы исходили извне.

4. @MilosIvanovic Это просто неправда. Он не эмулирует его в точности, он делает что-то совершенно другое. Обратная связь NAT — это форма двойного NAT. Обычное сопоставление портов — нет. Подумайте об этом с точки зрения сервера — с помощью loopback NAT преобразуются как исходный, так и конечный IP-адреса, в то время как при обычном сопоставлении портов изменяется только исходный IP-адрес.

5. @DavidSchwartz Для целей этого требования это позволит ему делать то, что он хочет.