Em C #, para usar um TcpClient ou geralmente para conectar a um soquete, como posso primeiro verificar se uma determinada porta está livre na minha máquina?
mais informações: Este é o código que uso:
TcpClient c;
//I want to check here if port is free.
c = new TcpClient(ip, port);
Respostas:
Como você está usando um
TcpClient
, significa que está verificando as portas TCP abertas. Existem muitos objetos bons disponíveis no namespace System.Net.NetworkInformation .Use o
IPGlobalProperties
objeto para chegar a uma matriz deTcpConnectionInformation
objetos, que você pode interrogar sobre o IP e a porta do endpoint.fonte
netstat -a -b
. Observe que asLISTENING
conexões não estão presentes noGetActiveTcpConnections()
. Você também deve fazer o check-inSystem.Net.IPEndPoints[]
devolvido poripGlobalProperties.GetActiveTcpListeners();
Você está do lado errado do Intertube. É o servidor que pode ter apenas uma porta específica aberta. Algum código:
Falha com:
fonte
Quando você configura uma conexão TCP, a 4-tupla (ip-fonte, porta-fonte, ip-dest, porta-dest) deve ser única - isso é para garantir que os pacotes sejam entregues no lugar certo.
Há uma outra restrição no lado do servidor , de que apenas um programa de servidor pode se vincular a um número de porta de entrada (assumindo um endereço IP; os servidores multi-NIC têm outros poderes, mas não precisamos discuti-los aqui).
Então, na extremidade do servidor, você:
No lado do cliente, geralmente é um pouco mais simples:
Não há exigência de que o IP / porta de destino seja exclusivo, pois isso resultaria em apenas uma pessoa por vez ser capaz de usar o Google, e isso destruiria muito bem seu modelo de negócios.
Isso significa que você pode até fazer coisas maravilhosas como FTP de várias sessões, já que configura várias sessões em que a única diferença é sua porta de origem, permitindo que você baixe pedaços em paralelo. Torrents são um pouco diferentes porque o destino de cada sessão geralmente é diferente.
E, depois de todo aquele waffling (desculpe), a resposta à sua pergunta específica é que você não precisa especificar uma porta livre. Se você estiver se conectando a um servidor com uma chamada que não especifica sua porta de origem, quase certamente estará usando zero nos bastidores e o sistema fornecerá uma porta não utilizada.
fonte
Você entendeu mal o que está acontecendo aqui.
Os parâmetros TcpClient (...) são do ip do servidor e da porta do servidor ao qual você deseja se conectar.
O TcpClient seleciona uma porta local temporária do pool disponível para se comunicar com o servidor. Não há necessidade de verificar a disponibilidade da porta local, pois ela é tratada automaticamente pela camada winsock.
Caso você não consiga se conectar ao servidor usando o fragmento de código acima, o problema pode ser um ou mais de vários. (ou seja, o ip e / ou porta do servidor está errado, o servidor remoto não está disponível, etc.)
fonte
Obrigado por esta dica. Eu precisava da mesma funcionalidade, mas no lado do servidor para verificar se uma porta estava em uso, então modifiquei para este código.
fonte
-anb
) e sem nenhum parâmetro mostra a conexão estrangeira, bem como o estado.obrigado pela resposta jro. Eu tive que ajustá-lo para meu uso. Eu precisava verificar se uma porta estava sendo ouvida e não necessariamente ativa. Por isso eu substituí
com
Eu iterou a matriz de endpoints verificando se meu valor de porta não foi encontrado.
fonte
fonte
netstat! É um utilitário de linha de comando de rede que vem com o Windows. Mostra todas as conexões estabelecidas atualmente e todas as portas que estão sendo ouvidas. Você pode usar este programa para verificar, mas se quiser fazer isso a partir do código, procure no namespace System.Net.NetworkInformation? É um novo namespace a partir de 2.0. Tem algumas guloseimas lá. Mas, eventualmente, se você quiser obter o mesmo tipo de informação que está disponível através do comando netstat, você precisará obter o resultado para P / Invoke ...
Atualização: System.Net.NetworkInformation
Esse namespace contém um monte de classes que você pode usar para descobrir coisas sobre a rede.
Não consegui encontrar aquele pedaço de código antigo, mas acho que você mesmo pode escrever algo semelhante. Um bom começo é verificar a API IP Helper . Google MSDN para o função GetTcpTable WINAPI e use P / Invoke para enumerar até que você tenha as informações de que precisa.
fonte
Se não me engano, você pode usar System.Network.whatever para verificar.
No entanto, isso sempre incorrerá em uma condição de corrida.
A maneira canônica de verificação é tentar escutar nessa porta. Se você receber um erro, a porta não foi aberta.
Acho que isso é parte do motivo pelo qual bind () e listen () são duas chamadas de sistema separadas.
fonte
Você diz
Mas você sempre pode se conectar a uma porta enquanto outras pessoas a estão usando, se algo estiver ouvindo lá. Caso contrário, a porta 80 http seria uma bagunça.
Se seu
falhar, então nada está ouvindo lá. Caso contrário, ele se conectará, mesmo que alguma outra máquina / aplicativo tenha um soquete aberto para aquele ip e porta.
fonte
ipGlobalProperties.GetActiveTcpConnections()
não retorna conexões no estado de escuta.A porta pode ser usada para escuta, mas sem ninguém conectado a ela, o método descrito acima não funcionará.
fonte
Das portas disponíveis, eu excluiria:
Com a seguinte importação:
Você pode usar a seguinte função para verificar se uma porta está disponível ou não:
Eu ofereço uma função semelhante para aqueles que usam VB.NET :
fonte
Para responder à pergunta exata de encontrar uma porta livre (que é o que eu precisava em meus testes de unidade) no dotnet core 3.1 eu vim
nota: com base no comentário de @ user207421 sobre a porta zero, pesquisei e encontrei isso e modifiquei ligeiramente.
fonte
Fique atento ao intervalo de tempo entre você fazer a verificação e o momento em que tenta fazer a conexão algum processo pode tomar a porta - o clássico TOCTOU . Por que você simplesmente não tenta se conectar? Se falhar, você sabe que a porta não está disponível.
fonte
Você não precisa saber quais portas estão abertas em sua máquina local para se conectar a algum serviço TCP remoto (a menos que queira usar uma porta local específica, mas geralmente esse não é o caso).
Cada conexão TCP / IP é identificada por 4 valores: IP remoto, número da porta remota, IP local, número da porta local, mas você só precisa saber o IP remoto e o número da porta remota para estabelecer uma conexão.
Quando você cria uma conexão tcp usando
Seu sistema atribuirá automaticamente um dos muitos números de porta local gratuitos à sua conexão. Você não precisa fazer nada. Você também pode querer verificar se uma porta remota está aberta. mas não há maneira melhor de fazer isso do que apenas tentando se conectar a ele.
fonte
fonte
fonte
Verifique o código de erro 10048
fonte
tente isso, no meu caso o número da porta para o objeto criado não estava disponível, então eu vim com este
fonte