2009-12-02 7 views
8

У меня есть какая-то проблема, и я не могу проверить это дома, если он работает или нет. Вот кодНе удается подключиться с удаленной машины

using System; 
using System.Net; 
using System.Net.Sockets; 
using System.Threading; 
using System.IO; 
using System.Net.Security; 

class Program 
{ 
    private static IPAddress ipAddress = IPAddress.Parse("127.0.0.1"); 
    private static int port = 6000; 
    private static string data = null; 

    static void Main(string[] args) 
    { 
     Thread thread = new Thread(new ThreadStart(receiveThread)); 
     thread.Start(); 
     Console.ReadKey(); 
    } 

    public static void receiveThread() 
    { 
     while (true) 
     { 
      TcpListener tcpListener = new TcpListener(ipAddress, port); 
      tcpListener.Start(); 

      Console.WriteLine("Waiting for connection..."); 

      TcpClient tcpClient = tcpListener.AcceptTcpClient(); 

      Console.WriteLine("Connected with {0}", tcpClient.Client.RemoteEndPoint); 

      while (!(tcpClient.Client.Poll(20, SelectMode.SelectRead))) 
      { 
       NetworkStream networkStream = tcpClient.GetStream(); 
       StreamReader streamReader = new StreamReader(networkStream); 

       data = streamReader.ReadLine(); 

       if(data != null) 
        Console.WriteLine("Received message: {0}", data); 
      } 
      Console.WriteLine("Dissconnected...\n"); 
      tcpListener.Stop(); 
     } 
    } 
} 

У меня есть простая программа, а также для подключения к этому, а затем отправить строку с данными. Он отлично работает на локальном хосте, но есть проблема, когда я пытаюсь подключиться к другому коммутатору.

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

ipAddress - это локальный адрес, потому что он работает с этим только сейчас. Любые предложения, что делать?

ответ

12

Вы должны установить его принимать соединения с любого IP, есть функция перегрузки IPAddress для этого:

System.Net.IPAddress.Any 

использовать его вместо 127.0.0.1, и это будет исправить вашу проблему.

1

Я думаю, что это ваш компьютер (сервер), который отказывается подключиться, потому что 127.0.0.1 является локальным (только).

Попробуйте эту простую перегрузку:

TcpListener tcpListener = new TcpListener(port); 
+0

Говорят, что этот метод устарел. Я использовал localhost ip, так как Im прослушивал мой компьютер для входящего соединения. Я думаю, он должен работать так, как есть, или я ошибаюсь? – Allek

+0

127001 - это только ваш компьютер от самого ПК. Вам нужно прослушивать внешне видимый IP-адрес, используя ответы IpDdress.Any. –

4

Вы слушаете на 127.0.0.1, который является петлевым адресом, который является специальным адресом, который означает «компьютер». Это означает, что вы будете принимать только соединения, выполненные на том же компьютере, на котором работает сервер.

Вам необходимо прослушать один (или несколько) реальных IP-адресов сервера.

+0

Так что я должен использовать там «мой интернет» ip для прослушивания входящих подключений? – Allek

+0

Вы можете использовать IPAddress.Any для прослушивания ВСЕХ ваших интерфейсов или адреса одного конкретного интерфейса для прослушивания JUST на этом интерфейсе. Если вам нужно прослушивать несколько интерфейсов, но не все, вам нужен один прослушиватель для каждого адреса. –

3

Ваша проблема заключается в том, что настройка IP-адреса явно при инициализации TcpListener разрешает принимать соединения только с , что адрес. Поэтому при локальном адресе 127.0.0.1 будут приниматься только соединения, происходящие с вашего ПК.

Реализация вы хотите использовать следующим образом:

TcpListener tcpListener = new TcpListener(IPAddress.Any, port); 

Это будет позволяет соединения с любого IP-адреса для подключения к программе на указанном порту.

Смежные вопросы