2012-03-08 25 views
7

Actualmente estoy trabajando en una pequeña utilidad de chat en C#.
El problema es que no puedo averiguar cómo escanear la red para un puerto específico en todas las máquinas. Actualmente estoy usando este métodoCómo escanear un puerto esperando una conexión en una red

IPGlobalProperties network = IPGlobalProperties.GetIPGlobalProperties(); 
    IEnumerable<IPEndPoint> connections = network.GetActiveTcpListeners() 
                 .Where(x => x.Port == ConstParams.iPort); 

donde ConstParams.iPort es el puerto Quiero escanear (6910 aquí).

El problema es que los valores devueltos son sólo los puertos locales y la dirección IP "0.0.0.0" ...

¿Cómo puedo escanear para todos los puertos abiertos (6910) en la red actual?

+1

Mirando hacia descripción de cómo * * nmap obras pueden ayudarle. –

Respuesta

9

En lugar de utilizar el escaneo de puertos, le sugiero que para implementar un mecanismo de descubrimiento sencilla basada en multidifusión/difusión de comunicación.

Durante el inicio, la aplicación debe transmitir/multidifundir su información de IP/Puerto. Todas las instancias en ejecución deberían responder a este mensaje con su información de IP/Puerto. Este tipo de mecanismo de descubrimiento es fácil de implementar, y es más rápido en tiempo de ejecución y más dinámico que el enfoque de escaneo de puertos.

+0

¿Puedes mostrar algún ejemplo? – rkmax

0

GetIPGlobalProperties solo devuelve información sobre su máquina local (consulte http://msdn.microsoft.com/en-us/library/system.net.networkinformation.ipglobalproperties.getipglobalproperties.aspx).

Para saber qué otras máquinas de la red tienen ese puerto abierto, debe iterar a través de un rango de direcciones IP, intentando conectarse en ese puerto. No hay un repositorio central para consultar sobre esto.

En este artículo se describe un enfoque: http://www.dijksterhuis.org/building-a-simple-portscanner-in-c/

1

Escanear puertos es una opción incorrecta, lo más probable es que desencadene cortafuegos en las máquinas de la red para mostrar su máquina como un atacante. Cualquier sistema de detección de intrusiones en las redes también podría ser activado. Es mucho sobrecargado para lo que necesita.

Yo recomendaría hacer una difusión usando UDP o una multidifusión para descubrir otros clientes http://www.codeproject.com/Articles/1705/IP-Multicasting-in-C

Otra opción sería tener un servidor centralizado, ya sea en un servidor web (script php, asp.net página, etc.) o un servicio web (REST) ​​al que el cliente de chat se conectaría al inicio, POSTiendo que escuchara IP/Puerto, y luego recibiría una lista de todos los IP/Puertos anunciados recientemente de los otros clientes en la red. Probablemente quieras mantener vivo aquí, IE: el cliente POSTARía a la página cada 5 minutos, si una IP no se PUBLA durante 10 minutos, se eliminaría de la lista.

Para obtener la dirección IP pública de la máquina, se puede consultar esta página: http://www.whatismyip.com/faq/automation.asp

Sólo había necesidad de enviar una solicitud web a él para recuperar la dirección IP. Si quieres obtener el no 0.0.0.0/127.0.0.1 IP de la interfaz local, puede consultar los siguientes mensajes:

Get local IP address

How do I get the Local Network IP address of a computer programmatically? (C#)

Cuestiones relacionadas