#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 Для целей этого требования это позволит ему делать то, что он хочет.