2012-03-08 7 views
7

Obecnie pracuję nad małym programem do czatowania w języku C#.
Problem polega na tym, że nie mogę określić sposobu skanowania sieci dla określonego portu na wszystkich komputerach. Obecnie używam tej metodyJak skanować w poszukiwaniu portu oczekującego na połączenie w sieci

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

gdzie ConstParams.iPort jest port chcę skanować (6910 tutaj).

Problemem jest to, że wartości zwracane są tylko lokalne porty i „0.0.0.0” adres ip ...

Jak mogę skanować do wszystkich otwartych portów (6910) na bieżącej sieci?

+1

Patrząc w opisie jak nmap * * prace mogą pomóc. –

Odpowiedz

9

Zamiast używać skanowanie portów, proponujemy wdrożenie prostego mechanizmu wykrywania na podstawie multicast/komunikacji nadawanych.

Podczas uruchamiania aplikacja powinna rozgłaszać/rozgłaszać informacje IP/Port. Wszystkie uruchomione instancje powinny odpowiedzieć na tę wiadomość z ich informacjami IP/Port. Ten rodzaj mechanizmu wykrywania jest łatwy do wdrożenia i jest zarówno szybszy w czasie wykonywania, jak i bardziej dynamiczny niż podejście do skanowania portów.

+0

Czy możesz pokazać przykład? – rkmax

0

GetIPGlobalProperties zwraca tylko informacje o lokalnym komputerze (patrz http://msdn.microsoft.com/en-us/library/system.net.networkinformation.ipglobalproperties.getipglobalproperties.aspx).

Aby dowiedzieć się, które inne komputery w sieci mają ten port otwarty, należy wykonać iterację z zakresu adresów IP, próbując połączyć się z tym portem. Nie ma centralnego repozytorium, do którego można by wysłać zapytanie.

Ten artykuł opisuje podejście: http://www.dijksterhuis.org/building-a-simple-portscanner-in-c/

1

Skanowanie portów jest złym wyborem, najprawdopodobniej wyzwolisz ściany ogniowe na komputerach w sieci, aby wyświetlić komputer jako atakującego. Możliwe jest również wyzwolenie wszystkich systemów wykrywania intruzów w sieciach. Jest dużo narzutów na to, czego potrzebujesz.

polecam robi transmisję za pomocą UDP lub multicast odkryć innych klientów http://www.codeproject.com/Articles/1705/IP-Multicasting-in-C

Innym rozwiązaniem byłoby mieć centralnego serwera, albo na serwerze WWW (skrypt PHP, strony ASP.NET, etc) lub usługa sieciowa (REST), z którą klient czatu łączył się podczas uruchamiania, POSTing, który nasłuchuje IP/Port, a następnie z kolei otrzymywał listę wszystkich ostatnio ogłoszonych adresów IP/portów innych klientów w sieci. Prawdopodobnie chciałbyś, aby niektórzy pozostali przy życiu, IE: klient będzie wysyłał pocztę do strony co 5 minut, jeśli IP nie będzie POST przez 10 minut, zostanie usunięty z listy.

Aby uzyskać publiczny adres IP urządzenia, można sprawdzić na tej stronie: http://www.whatismyip.com/faq/automation.asp

że wystarczy wysłać żądanie, aby go pobrać IP. Jeśli chcesz uzyskać wartość inną niż 0.0.0.0/127.0.0.1 IP lokalnego interfejsu, można sprawdzić te posty:

Get local IP address

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

Powiązane problemy