visual una studio socket receive publica obtener nombre net maquina how example equipo clientsocket cliente asp c# networking

una - visual studio c# socket example



¿Cómo obtener*internet*IP? (15)

Imagine una situación, tengo una PC con dos tarjetas LAN, una está conectada a Internet, otra está conectada a la red local, ¿cómo puedo detectar la IP que está conectada a Internet con C #?


Usa tracert El primer salto siempre debe estar en la misma subred que su NIC de Internet.

ejemplo desde el símbolo del sistema.

tracert google.com

la primera línea es 10.0.0.254 y mi nic tiene la ip de 10.0.2.48. Entonces es un ejercicio simple de analizar la salida de tracert.


Aquí hay un artículo que podría ser útil:

Cómo recuperar "Interfaces de red" en C #

El siguiente código se usa para recuperar las "interfaces de red" en C #. Puede reconocer las "interfaces de red" como "Conexiones de red y de acceso telefónico": puede acceder a ellas utilizando "Inicio> Configuración> Conexiones de red y de acceso telefónico". C # no proporciona una forma simple de recuperar esta lista.


Encontré una solución:

IPGlobalProperties ipProperties = IPGlobalProperties.GetIPGlobalProperties(); Console.WriteLine(ipProperties.HostName); foreach (NetworkInterface networkCard in NetworkInterface.GetAllNetworkInterfaces()) { foreach (GatewayIPAddressInformation gatewayAddr in networkCard.GetIPProperties().GatewayAddresses) { Console.WriteLine("Information: "); Console.WriteLine("Interface type: {0}", networkCard.NetworkInterfaceType.ToString()); Console.WriteLine("Name: {0}", networkCard.Name); Console.WriteLine("Id: {0}", networkCard.Id); Console.WriteLine("Description: {0}", networkCard.Description); Console.WriteLine("Gateway address: {0}", gatewayAddr.Address.ToString()); Console.WriteLine("IP: {0}", System.Net.Dns.GetHostByName(System.Net.Dns.GetHostName()).AddressList[0].ToString()); Console.WriteLine("Speed: {0}", networkCard.Speed); Console.WriteLine("MAC: {0}", networkCard.GetPhysicalAddress().ToString()); } }


Intenta hacer ping a www.google.com en ambas interfaces.


La conexión a Internet debe estar en la misma red IP que la puerta de enlace predeterminada.

Realmente no hay manera de saber a través de la dirección IP si puede acceder a "Internet" o no. Básicamente puede comunicarse con su propia red IP. Todo lo demás tiene que pasar por una puerta de enlace. Entonces, si no puedes ver la puerta de enlace, estás confinado a la red IP local.

La puerta de enlace, sin embargo, depende de otras puertas de enlace, por lo que incluso si puede acceder a la puerta de enlace, es posible que no pueda acceder a otra red. Esto puede deberse, por ejemplo, al filtrado o falta de rutas a las redes deseadas.

En realidad, tiene poco sentido hablar de internet en este sentido, ya que probablemente nunca podrá llegar a Internet en un momento dado. Por lo tanto, averigüe qué necesita para poder alcanzar y verificar la conectividad de esa red.


No es 100% preciso (algunos ISP no le dan direcciones IP públicas), pero puede verificar si la dirección IP se encuentra en uno de los rangos reservados para direcciones privadas. Ver http://en.wikipedia.org/wiki/Classful_network


Para un truco rápido (que sin duda se romperá con configuraciones LAN elaboradas o IPv6), obtenga una lista de todas las IP que tiene la máquina actual, y elimine todas las IP: s que coincidan con cualquiera de los siguientes:

10.* 127.* // <- Kudos to Brian for spotting the mistake 172.[16-31].* 192.168.*


Una forma estrafalaria es buscar y eliminar uno de los muchos sitios web tipo ''¿Cuál es mi IP''?


Ya busco eso, lo encontré en este proyecto codeplex http://www.codeplex.com/xedus . Es un freeware P2P que no funciona pero hay una clase que usa la API correcta para obtener la tarjeta de LAN que tiene la IP de Internet


Prueba esto:

static IPAddress getInternetIPAddress() { try { IPAddress[] addresses = Dns.GetHostAddresses(Dns.GetHostName()); IPAddress gateway = IPAddress.Parse(getInternetGateway()); return findMatch(addresses, gateway); } catch (FormatException e) { return null; } } static string getInternetGateway() { using (Process tracert = new Process()) { ProcessStartInfo startInfo = tracert.StartInfo; startInfo.FileName = "tracert.exe"; startInfo.Arguments = "-h 1 208.77.188.166"; // www.example.com startInfo.UseShellExecute = false; startInfo.RedirectStandardOutput = true; tracert.Start(); using (StreamReader reader = tracert.StandardOutput) { string line = ""; for (int i = 0; i < 9; ++i) line = reader.ReadLine(); line = line.Trim(); return line.Substring(line.LastIndexOf('' '') + 1); } } } static IPAddress findMatch(IPAddress[] addresses, IPAddress gateway) { byte[] gatewayBytes = gateway.GetAddressBytes(); foreach (IPAddress ip in addresses) { byte[] ipBytes = ip.GetAddressBytes(); if (ipBytes[0] == gatewayBytes[0] && ipBytes[1] == gatewayBytes[1] && ipBytes[2] == gatewayBytes[2]) { return ip; } } return null; }

Tenga en cuenta que esta implementación de findMatch() basa en la coincidencia de clase C. Si desea admitir la coincidencia de clase B, simplemente omita la comprobación de ipBytes[2] == gatewayBytes[2] .

Editar historial:

  • Actualizado para usar www.example.com .
  • Se actualizó para incluir getInternetIPAddress() , para mostrar cómo usar los otros métodos.
  • Actualizado para capturar FormatException si getInternetGateway() no pudo analizar el IP de la puerta de enlace. (Esto puede suceder si el enrutador de la puerta de enlace está configurado de modo que no responda a las solicitudes de traceroute ).
  • Citó el comentario de Brian Rasmussen.
  • Se actualizó para usar la dirección IP para www.example.com, para que funcione incluso cuando el servidor DNS esté inactivo.

Simplemente podría leer http://myip.dnsomatic.com/

Es un servicio confiable de OpenDNS, y lo uso para obtener la IP externa todo el tiempo.


Este es mi intento de obtener la dirección IPv4 predeterminada sin tener que recurrir a llamadas de proceso DNS o externas a comandos como ipconfig y route. Esperemos que la próxima versión de .Net proporcione acceso a la tabla de enrutamiento de Windows.

public static IPAddress GetDefaultIPv4Address() { var adapters = from adapter in NetworkInterface.GetAllNetworkInterfaces() where adapter.OperationalStatus == OperationalStatus.Up && adapter.Supports(NetworkInterfaceComponent.IPv4) && adapter.GetIPProperties().GatewayAddresses.Count > 0 && adapter.GetIPProperties().GatewayAddresses[0].Address.ToString() != "0.0.0.0" select adapter; if (adapters.Count() > 1) { throw new ApplicationException("The default IPv4 address could not be determined as there are two interfaces with gateways."); } else { UnicastIPAddressInformationCollection localIPs = adapters.First().GetIPProperties().UnicastAddresses; foreach (UnicastIPAddressInformation localIP in localIPs) { if (localIP.Address.AddressFamily == AddressFamily.InterNetwork && !localIP.Address.ToString().StartsWith(LINK_LOCAL_BLOCK_PREFIX) && !IPAddress.IsLoopback(localIP.Address)) { return localIP.Address; } } } return null; }


Sugiero este código simple ya que tracert no siempre es efectivo y whatsmyip.com no está especialmente diseñado para ese propósito:

private void GetIP() { WebClient wc = new WebClient(); string strIP = wc.DownloadString("http://checkip.dyndns.org"); strIP = (new Regex(@"/b/d{1,3}/./d{1,3}/./d{1,3}/./d{1,3}/b")).Match(strIP).Value; wc.Dispose(); return strIP; }


Una solución alternativa (que probablemente sea más precisa) es usar el comando de route Windows. Aquí hay un código que funciona para mí en Windows Vista:

static string getInternetConnectionIP() { using (Process route = new Process()) { ProcessStartInfo startInfo = route.StartInfo; startInfo.FileName = "route.exe"; startInfo.Arguments = "print 0.0.0.0"; startInfo.UseShellExecute = false; startInfo.RedirectStandardOutput = true; route.Start(); using (StreamReader reader = route.StandardOutput) { string line; do { line = reader.ReadLine(); } while (!line.StartsWith(" 0.0.0.0")); // the interface is the fourth entry in the line return line.Split(new char[] { '' '' }, StringSplitOptions.RemoveEmptyEntries)[3]; } } }


en la misma dirección que Lukas Šalkauskas, un amigo mío y yo escribimos este código:

/* digged, built and (here and there) copied "as is" from web, without paying attention to style. Please, do not shot us for this. */ public static void DisplayIPAddresses() { Console.WriteLine("/r/n****************************"); Console.WriteLine(" IPAddresses"); Console.WriteLine("****************************"); StringBuilder sb = new StringBuilder(); // Get a list of all network interfaces (usually one per network card, dialup, and VPN connection) NetworkInterface[] networkInterfaces = NetworkInterface.GetAllNetworkInterfaces(); foreach (NetworkInterface network in networkInterfaces) { if (network.OperationalStatus == OperationalStatus.Up ) { if (network.NetworkInterfaceType == NetworkInterfaceType.Tunnel) continue; if (network.NetworkInterfaceType == NetworkInterfaceType.Tunnel) continue; //GatewayIPAddressInformationCollection GATE = network.GetIPProperties().GatewayAddresses; // Read the IP configuration for each network IPInterfaceProperties properties = network.GetIPProperties(); //discard those who do not have a real gateaway if (properties.GatewayAddresses.Count > 0) { bool good = false; foreach (GatewayIPAddressInformation gInfo in properties.GatewayAddresses) { //not a true gateaway (VmWare Lan) if (!gInfo.Address.ToString().Equals("0.0.0.0")) { sb.AppendLine(" GATEAWAY "+ gInfo.Address.ToString()); good = true; break; } } if (!good) { continue; } } else { continue; } // Each network interface may have multiple IP addresses foreach (IPAddressInformation address in properties.UnicastAddresses) { // We''re only interested in IPv4 addresses for now if (address.Address.AddressFamily != AddressFamily.InterNetwork) continue; // Ignore loopback addresses (e.g., 127.0.0.1) if (IPAddress.IsLoopback(address.Address)) continue; if (!address.IsDnsEligible) continue; if (address.IsTransient) continue; sb.AppendLine(address.Address.ToString() + " (" + network.Name + ") nType:" + network.NetworkInterfaceType.ToString() ); } } } Console.WriteLine(sb.ToString()); }