2017-02-07 8 views
0

Я пытаюсь сделать небольшой простой сервер, который я могу использовать между колледжем и домом. Сервер работает нормально, клиенты могут подключаться. Но я хочу иметь возможность подключаться из-за пределов локальной сети. Я пытаюсь найти способ, чтобы отобразить IP-адрес машины, необходимые для подключения к нему:Отображение IP-адреса локального компьютера для подключения вне сети?

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Net.Sockets; 
using System.Net; 

namespace SocketProgramming 
{ 
    class Program 
    { 

    private static byte[] _buffer = new byte[1024]; 
    private static Socket _serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
    private static List<Socket> _clientSockets = new List<Socket>(); 
    private static List<string> _nicknames = new List<string>(); 

    static void Main(string[] args) 
    { 

     SetupServer(); 
     Console.ReadLine(); 

    } 

    private static void SetupServer() 
    { 

     Console.Write("Enter a port number to establish the server on: "); 
     int portNum = Int32.Parse(Console.ReadLine()); 
     _serverSocket.Bind(new IPEndPoint(IPAddress.Any, portNum)); 
     _serverSocket.Listen(5); 

     _serverSocket.BeginAccept(new AsyncCallback(AcceptCallback), null); 

    } 
} 
} 

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

+0

Возможный дубликат [Получить локальный IP-адрес] (http://stackoverflow.com/questions/6803073/get-local-ip-address) –

+0

Я предполагаю, что ваш «сервер» будет в вашей домашней сети и ваш клиент будет работать за пределами этой сети. В этом случае вы хотите узнать IP-адрес сервера, который будет публичным IP-адресом вашей домашней сети. Это значение не является статическим, если вы не используете какой-либо сервис ($$) для получения статического IP-адреса для вашего дома. –

+0

@ThomasWeller Это исправлено. Спасибо, бутон! –

ответ

0

Этот post был очень полезен для меня при попытке решить ту же проблему. Мой код реализации завершился с помощью this answer с небольшой модификацией, чтобы точно указать, какой тип протокола я хотел.

string localIP; 

     try 
     { 
      using (Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.IP)) 
      { 
       socket.Connect("8.8.8.8", 65530); 
       IPEndPoint endPoint = socket.LocalEndPoint as IPEndPoint; 
       localIP = endPoint.Address.ToString(); 
      } 
     } 
     catch (Exception ex) 
     { 
      localIP = String.Empty; 
     } 

     return localIP; 
0

Стоит отметить, что машина может иметь более одного IP-адреса. Вы можете получить быстрый список, используя команду «ipconfig» из командной строки dos или powershell. Вы можете сделать что-то подобное в C# как это:

 foreach (NetworkInterface netInterface in NetworkInterface.GetAllNetworkInterfaces()) { 
      Console.WriteLine("Name: " + netInterface.Name); 
      Console.WriteLine("Description: " + netInterface.Description); 
      Console.WriteLine("Addresses: "); 
      IPInterfaceProperties ipProps = netInterface.GetIPProperties(); 
      foreach (UnicastIPAddressInformation addr in ipProps.UnicastAddresses) { 
       Console.WriteLine(" " + addr.Address.ToString()); 
       } 
      Console.WriteLine(""); 
      } 

см: Get All IP Addresses On Machine

Кроме того, если пытается достичь удаленной машины можно столкнуться с проблемами брандмауэра/маршрутизатора. Если ваш IP-адрес хоста является адресом без маршрутизации (например, 10. *. *. * Или 192.168. *. * И т. Д.), Вы не сможете связаться с ним из-за пределов этой сети.

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