W C # do korzystania z TcpClient lub ogólnie do łączenia się z gniazdem, jak mogę najpierw sprawdzić, czy określony port jest wolny na moim komputerze?
więcej informacji: Oto kod, którego używam:
TcpClient c;
//I want to check here if port is free.
c = new TcpClient(ip, port);
Odpowiedzi:
Ponieważ używasz a
TcpClient
, oznacza to , że sprawdzasz otwarte porty TCP. W przestrzeni nazw System.Net.NetworkInformation dostępnych jest wiele dobrych obiektów .Użyj
IPGlobalProperties
obiektu, aby dostać się do tablicyTcpConnectionInformation
obiektów, którą możesz następnie zapytać o adres IP i port punktu końcowego.źródło
netstat -a -b
. Zwróć uwagę, żeLISTENING
połączenia nie są obecne wGetActiveTcpConnections()
. Powinieneś również zameldować się, którySystem.Net.IPEndPoints[]
wróciłipGlobalProperties.GetActiveTcpListeners();
Jesteś na złym końcu Intertube. Jest to serwer, który może mieć otwarty tylko jeden określony port. Jakiś kod:
Zawodzi z:
źródło
Podczas konfigurowania połączenia TCP 4 krotki (źródłowy adres IP, źródłowy port, docelowy adres IP, docelowy port) muszą być unikalne - ma to na celu zapewnienie, że pakiety są dostarczane we właściwe miejsce.
Istnieje dalsze ograniczenie po stronie serwera, że tylko jeden program serwera może połączyć się z numerem portu przychodzącego (zakładając jeden adres IP; serwery z wieloma kartami sieciowymi mają inne uprawnienia, ale nie musimy ich tutaj omawiać).
Tak więc po stronie serwera:
Po stronie klienta jest to zwykle trochę prostsze:
Nie ma wymogu, aby docelowy adres IP / port był niepowtarzalny, ponieważ w danym momencie tylko jedna osoba mogłaby korzystać z Google, a to całkiem nieźle zniszczyłoby jej model biznesowy.
Oznacza to, że możesz nawet robić tak cudowne rzeczy, jak wielosesyjne FTP, ponieważ konfigurujesz wiele sesji, w których jedyną różnicą jest port źródłowy, umożliwiając równoległe pobieranie fragmentów. Torrenty różnią się nieco, ponieważ miejsce docelowe każdej sesji jest zwykle inne.
I po tym wszystkim (przepraszam), odpowiedź na twoje konkretne pytanie jest taka, że nie musisz określać wolnego portu. Jeśli łączysz się z serwerem za pomocą połączenia, które nie określa portu źródłowego, prawie na pewno będzie używać zera pod osłonami, a system da ci nieużywany.
źródło
Źle zrozumiałeś, co się tutaj dzieje.
Parametry TcpClient (...) dotyczą adresu IP serwera i portu serwera, z którym chcesz się połączyć.
TcpClient wybiera przejściowy port lokalny z dostępnej puli do komunikacji z serwerem. Nie ma potrzeby sprawdzania dostępności portu lokalnego, ponieważ jest on automatycznie obsługiwany przez warstwę winsock.
W przypadku, gdy nie możesz połączyć się z serwerem przy użyciu powyższego fragmentu kodu, problem może dotyczyć jednego lub kilku z kilku. (tj. adres IP i / lub port serwera są nieprawidłowe, serwer zdalny jest niedostępny itp.)
źródło
Dzięki za tę wskazówkę. Potrzebowałem tej samej funkcjonalności, ale po stronie serwera, aby sprawdzić, czy port był używany, więc zmodyfikowałem go do tego kodu.
źródło
-anb
) i bez żadnych parametrów pokazuje połączenie obce oraz stan.dzięki za odpowiedź jro. Musiałem go dostosować do własnego użytku. Musiałem sprawdzić, czy port jest nasłuchiwany i niekoniecznie aktywny. Na to wymieniłem
z
Wykonałem iterację tablicy punktów końcowych, sprawdzając, czy moja wartość portu nie została znaleziona.
źródło
źródło
netstat! To narzędzie wiersza poleceń sieci, które jest dostarczane z systemem Windows. Pokazuje wszystkie aktualnie ustanowione połączenia i wszystkie aktualnie nasłuchiwane porty. Możesz użyć tego programu do sprawdzenia, ale jeśli chcesz to zrobić z poziomu kodu, zajrzyj do przestrzeni nazw System.Net.NetworkInformation? Jest to nowa przestrzeń nazw od 2.0. Jest tam kilka smakołyków. Ale w końcu, jeśli chcesz uzyskać ten sam rodzaj informacji, który jest dostępny za pomocą polecenia netstat, będziesz potrzebować wyniku P / Invoke ...
Aktualizacja: System.Net.NetworkInformation
Ta przestrzeń nazw zawiera kilka klas, których możesz użyć do zorientowania się w sieci.
Nie udało mi się znaleźć tej starej części kodu, ale myślę, że sam możesz napisać coś podobnego. Na dobry początek sprawdź interfejs API pomocnika IP . Google MSDN dla funkcji GetTcpTable WINAPI i użyj P / Invoke do wyliczenia, aż uzyskasz potrzebne informacje.
źródło
Jeśli się nie mylę, możesz użyć System.Network.cokolwiek do sprawdzenia.
Jednak zawsze spowoduje to stan wyścigu.
Kanonicznym sposobem sprawdzenia jest próba nasłuchiwania na tym porcie. Jeśli pojawi się błąd, oznacza to, że port nie był otwarty.
Myślę, że jest to część tego, dlaczego bind () i Listen () to dwa oddzielne wywołania systemowe.
źródło
Mówisz
Ale zawsze możesz podłączyć się do portu, podczas gdy inni go używają, jeśli coś tam nasłuchuje. W przeciwnym razie port http 80 byłby bałaganem.
Jeżeli twój
zawiedzie, wtedy nic nie słucha. W przeciwnym razie połączy się, nawet jeśli inna maszyna / aplikacja ma gniazdo otwarte dla tego adresu IP i portu.
źródło
ipGlobalProperties.GetActiveTcpConnections()
nie zwraca połączeń w stanie nasłuchiwania.Port może służyć do nasłuchu, ale jeśli nikt do niego nie jest podłączony, metoda opisana powyżej nie zadziała.
źródło
Z dostępnych portów wykluczyłbym:
Z następującym importem:
Możesz użyć następującej funkcji, aby sprawdzić, czy port jest dostępny, czy nie:
Podobną funkcję daję tym, którzy używają VB.NET :
źródło
Aby odpowiedzieć na dokładne pytanie dotyczące znalezienia wolnego portu (czego potrzebowałem w moich testach jednostkowych) w dotnet core 3.1, wymyśliłem to
uwaga: na podstawie komentarza @ user207421 o porcie zero szukałem i znalazłem to i nieznacznie zmodyfikowałem.
źródło
Zwróć uwagę na przedział czasu między dokonaniem sprawdzenia a momentem próby nawiązania połączenia jakiś proces może zająć port - klasyczne TOCTOU . Dlaczego po prostu nie spróbujesz się połączyć? Jeśli się nie powiedzie, wiesz, że port jest niedostępny.
źródło
Nie musisz wiedzieć, które porty są otwarte na komputerze lokalnym, aby połączyć się z jakąś zdalną usługą TCP (chyba że chcesz użyć określonego portu lokalnego, ale zwykle tak nie jest).
Każde połączenie TCP / IP jest identyfikowane za pomocą 4 wartości: zdalny adres IP, zdalny numer portu, lokalny adres IP, lokalny numer portu, ale wystarczy znać zdalny adres IP i zdalny numer portu, aby nawiązać połączenie.
Podczas tworzenia połączenia TCP za pomocą
Twój system automatycznie przypisze jeden z wielu bezpłatnych lokalnych numerów portów do połączenia. Nie musisz nic robić. Możesz również sprawdzić, czy port zdalny jest otwarty. ale nie ma lepszego sposobu na zrobienie tego niż próba połączenia się z nim.
źródło
źródło
źródło
Sprawdź kod błędu 10048
źródło
spróbuj tego, w moim przypadku numer portu dla utworzonego obiektu nie był dostępny, więc wymyśliłem to
źródło