2014-08-28 4 views
0

Что я должен сделать, это простая передача данных (строки или байтов) с одного компьютера на другой. Я использую сокеты в качестве связей между удаленными компьютерами. Я нахожусь в начале моего проекта, но проблема в том, что я не могу установить успешную связь между компьютерами. Я не понимаю, какой IP-адрес должен быть в IPEndpoint, мой компьютер IPv4? Мой маршрутизатор IP? Я думаю, что проблема n моего кода. Цель этого иметь 1 клиента и 1 сервер, после этого я буду развивать это гораздо более крупное приложение, но сейчас мой код:Передача данных между удаленными компьютерами

Сервер:

class Server 
{ 
    static byte[] buffer; 
    static string data; 
    public static void StartListening() 
    { 
     while (true) 
     { 
      byte[] bytes = new Byte[100000]; 
      IPHostEntry ipHostInfo = Dns.Resolve(Dns.GetHostName()); 
      IPAddress ipAddress = ipHostInfo.AddressList[2]; 
      IPEndPoint localEndPoint = new IPEndPoint(ipAddress,16000); 
      Socket listener = new Socket(AddressFamily.InterNetwork, 
       SocketType.Stream, ProtocolType.Tcp); 
      try 
      { 
       listener.Bind(localEndPoint); 
       listener.Listen(100); 
       while (true) 
       { 
        Socket handler = listener.Accept(); 
        data = null; 
        while (true) 
        { 
         bytes = new byte[1000]; 
         int bytesRec = handler.Receive(bytes); 
         data += Encoding.ASCII.GetString(bytes, 0, bytesRec); 
         if (data != null) 
         { 
          Console.WriteLine(data); 
          break; 
         } 

        } 
        handler.Shutdown(SocketShutdown.Both); 
        handler.Close(); 
       } 
      } 
      catch (Exception e) 
      { 
       Console.WriteLine(e.ToString()); 
      } 
     } 
    } 
} 

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

public static void SendData(string send) 
    { 
     try 
     { 
      IPHostEntry ipHostInfo = Dns.Resolve(Dns.GetHostName()); 
      IPAddress ipAddress = ipHostInfo.AddressList[0]; 
      IPEndPoint remoteEP = new IPEndPoint(IPAddress.Parse("MyIPAddressThat in hostinfo Addresses[2]"), 16000); 
      Socket sender = new Socket(AddressFamily.InterNetwork, 
       SocketType.Stream, ProtocolType.Tcp); 
      try 
      { 
       sender.Connect(remoteEP); 
       byte[] msg = Encoding.ASCII.GetBytes(send); 
       sender.Send(msg); 
       sender.Shutdown(SocketShutdown.Both); 
       sender.Close(); 

      } 
      #region Catch 
      catch (ArgumentNullException ane) 
      { 
       Console.WriteLine("ArgumentNullException : {0}", ane.ToString()); 
      } 
      catch (SocketException se) 
      { 
       Console.WriteLine("SocketException : {0}", se.ToString()); 
      } 
      catch (Exception e) 
      { 
       Console.WriteLine("Unexpected exception : {0}", e.ToString()); 
      } 

     } 
     catch (Exception e) 
     { 
      Console.WriteLine(e.ToString()); 
     } 
      #endregion 
    } 

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

+0

+1 потому, что дает отрицательный голос без комментариев не приятно ... – Kristof

ответ

0

Я предполагаю, что ошибка лежит здесь:

IPAddress ipAddress = ipHostInfo.AddressList[0]; 
IPEndPoint localEndPoint = new IPEndPoint(IPAddress.Any, 11000); 

Почему вы привязки IPAdress.Any к конечной точке маршрута? Это должен быть IP-адрес, на котором находится ваш сервер. Вы пытались передать ipAddress в качестве параметра, как это?

IPAddress ipAddress = ipHostInfo.AddressList[0]; 
IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 11000); 
+0

Я думал, что результаты IP address.Any будет, что любой IP может подключиться к серверу, я имею в виду, что любой компьютер программа-клиент будет может подключиться к серверу (мне) – Xboxbo

+0

Конечной точкой является ваш конечный пункт. Предположим, у вас есть несколько сетевых карт (как и многие серверы), тогда вам нужно указать, какой сетевой адаптер (или IP-адрес) должен прослушивать сервер. Я думаю, что вы можете фильтровать IP-адрес клиента, но вам нужно будет сделать это, как только будет установлено соединение сокета. – Kristof

+0

После того, как я сделал некоторые изменения в этом коде, он работает, но только на моем компьютере, когда его в моем ноутбуке он не работает, я думаю, что это потому, что клиент IPaddress. – Xboxbo

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