2009-02-13 9 views
3

Я работаю над простым сервером приложений TCP/IP для приветствия в 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); 

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

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

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

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

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

Спасибо!

ответ

5

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

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

+0

Я должен был просто попросить вас, в первую очередь, - это сделал трюк. любая идея, почему это имеет значение? –

+1

Ваша машина сидит в нескольких IP-сетях одновременно, в вашем случае, loopback и локальная сеть. Вы явно просили только прослушать 127.0.0.1, и единственный аппарат на 127.0.0.1/32 принадлежит вам. Машина могла подключаться к себе (через 127.0.0.1/32), но никто другой не мог. – Coincoin

3

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

+0

хорошая мысль - попробовали это, и он утверждает, что ожидаемый порт связан и слушает! –

1

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

+0

Я делал что-то сложное и достойное, я думаю, что я бы посоветовал, однако программное обеспечение, которое я пишу, нужно *, чтобы быть мучительно простым, чтобы быть подходящим для нас. кроме того, мне не нужно передавать объекты туда и обратно. я буду помнить это! –

1

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

9

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

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

EDIT: Если вы жестко указываете IP-адрес аппарата, слушатель будет прослушивать только этот сетевой интерфейс. Если вы используете 0.0.0.0, слушатель прослушивает все доступные сетевые интерфейсы. Это включает в себя интерфейсы между вашим компьютером и USB-накопителем, вторую сетевую карту или VPN-соединение.

+0

Я тоже столкнулся с этим. –

+0

. Какова была бы разница между использованием 0.0.0.0 и фактическим IP-адресом, как это было предложено Coincoin выше? это решение, с которым я пошел, и, похоже, все работает нормально. –

+1

Разница заключается в том, что если вы жестко определяете IP-адрес, он будет работать только с сетевым интерфейсом с этим адресом. Если вы используете 0.0.0.0, он будет прослушивать все доступные сетевые интерфейсы. – Mykroft