Невозможно установить соединение, потому что целевой компьютер активно отказывается от него - PullRequest
3 голосов
/ 13 февраля 2009

Я работаю над простым клиентским серверным приложением TCP / IP hello world на C # и не могу подключить мой клиент. Кто-нибудь может предложить какие-либо дополнительные шаги по устранению неполадок? У меня заканчиваются идеи ...

Вот соответствующие разделы кода:

Сервер:

Console.Out.WriteLine("About to bind address");
IPAddress ipAd = IPAddress.Parse("127.0.0.1"); 
Console.Out.WriteLine("Choose a port to bind...");

String port = Console.In.ReadLine();
int iPort = Int32.Parse(port);

TcpListener myList = new TcpListener(ipAd, iPort);

myList.Start();

Console.WriteLine("The server is running at: "+myList.LocalEndpoint);
Console.WriteLine("Waiting for a connection.....");

Socket s = myList.AcceptSocket();
Console.WriteLine("Connection accepted from " + s.RemoteEndPoint);

клиент:

Console.Out.WriteLine("enter address: ");
string address = Console.In.ReadLine();
Console.Out.WriteLine("enter port: ");
int port = Convert.ToInt32(Console.In.ReadLine());

TcpClient tcpclnt = new TcpClient();
Console.WriteLine("Connecting.....");

Console.Out.WriteLine("Address: " + address + ":" + port);
tcpclnt.Connect(address, port);

Я могу пропинговать сервер с клиентского компьютера, однако я не могу подключиться к серверу по telnet через связанный порт. Я пробовал различные порты (несколько в нижних 8000 и несколько около 40000). Я отключил брандмауэр Windows на обеих системах. Системы подключены к роутеру, которого нет в интернете. Я попытался с и без переадресации портов, установленной для переадресации входящих запросов на данный порт на компьютер сервера без эффекта.

Единственное исключение, которое мне удалось перехватить, выдается клиентом:

Невозможно установить соединение, потому что целевая машина активно отказывается это.

Я проверил InnerException, но, похоже, их нет - это базовое исключение. Может ли это быть правильно?

Не уверен, что еще я должен смотреть - любые дополнительные шаги по устранению неполадок будут полезны.

Спасибо!

Ответы [ 5 ]

9 голосов
/ 13 февраля 2009

Я сталкивался с этим раньше. Хитрость заключается в том, чтобы связать с 0.0.0.0, а не 127.0.0.1. Когда вы связываетесь с 127.0.0.1, сервер будет принимать соединения только от localhost. Привязка к 0.0.0.0 будет принимать все запросы.

Вы также можете захотеть nmap хост-машине от клиента и посмотреть, какие порты она видит как открытые.

РЕДАКТИРОВАТЬ: Если вы жестко запрограммируете IP-адрес устройства в нем, слушатель будет прослушивать только этот сетевой интерфейс. Если вы используете 0.0.0.0, слушатель будет прослушивать все доступные сетевые интерфейсы. Это включает в себя интерфейсы между вашим компьютером и USB-устройством, второй сетевой картой или VPN-соединением.

6 голосов
/ 13 февраля 2009

Приведенный выше код прослушивает запрос, поступающий с адреса обратной связи. Это будет эффективно прослушивать только соединение в этой сети, и эта сеть включает только вашу машину.

Вы пытались прослушать адрес, связанный с сетью, с которой должно происходить соединение? В локальной сети это должно быть что-то вроде 192.168.x.x или 10.x.x.x

3 голосов
/ 13 февраля 2009

попробуйте netstat -al на вашем компьютере (точная командная строка зависит от Windows и Unix) и посмотрите, прослушивает ли сервер порт

1 голос
/ 13 февраля 2009

Вы пытались запустить клиентский сервер на той же машине, чтобы убедиться, что соединение установлено первым? Кроме того, попробуйте использовать назначенный маршрутизатор или статический IP-адрес компьютера, на котором работает сервер, и привязку к петле.

1 голос
/ 13 февраля 2009

Почему вы не используете удаленное взаимодействие .NET? Это лучше, чем делать клиентский сервер TCP / IP. Вы можете передавать сообщения между объектами.

...