Estou tentando jogar com a comunicação entre processos e, como não consegui descobrir como usar pipes nomeados no Windows, pensei em usar soquetes de rede. Tudo acontece localmente. O servidor é capaz de iniciar escravos em um processo separado e escuta em alguma porta. Os escravos fazem seu trabalho e enviam o resultado ao mestre. Como faço para descobrir qual porta está disponível? Presumo que não posso ouvir na porta 80 ou 21?
Estou usando Python, se isso reduzir as opções.
Obrigado!
Respostas:
Não ligue a uma porta específica ou ligue à porta 0, por exemplo
sock.bind(('', 0))
. O sistema operacional escolherá uma porta disponível para você. Você pode obter a porta que foi escolhida usandosock.getsockname()[1]
e passá-la aos escravos para que eles possam se conectar novamente.fonte
sock.bind(('',0))
Por uma questão de trecho do que os caras explicaram acima:
fonte
s.bind(('localhost', 0))
é melhors.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
socket.SO_REUSEADDR
Realmente ajuda nesse caso? Pelo que li, é relevante apenas que o soquete que está tentando vincular tenhaSO_REUSEADDR
e é irrelevante se esse sinalizador está definido no soquete remanescente.Ligue o soquete à porta 0. Uma porta livre aleatória de 1024 a 65535 será selecionada. Você pode recuperar a porta selecionada
getsockname()
logo apósbind()
.fonte
Você pode ouvir em qualquer porta que desejar; geralmente, os aplicativos do usuário devem ouvir as portas 1024 e superiores (até 65535). O principal, se você tiver um número variável de ouvintes, é alocar um intervalo para seu aplicativo - digamos 20000-21000 e CATCH EXCEPTIONS . É assim que você saberá se uma porta não pode ser usada (usada por outro processo, em outras palavras) no seu computador.
No entanto, no seu caso, você não deve ter problemas ao usar uma única porta codificada para o seu ouvinte, desde que imprima uma mensagem de erro se a ligação falhar.
Observe também que a maioria dos seus soquetes (para os escravos) não precisa ser explicitamente vinculada a números de porta específicos - apenas os soquetes que aguardam conexões de entrada (como seu mestre aqui) precisarão ser ouvintes e vinculados a uma porta. Se uma porta não for especificada para um soquete antes de ser usada, o sistema operacional atribuirá uma porta utilizável ao soquete. Quando o mestre deseja responder a um escravo que envia dados, o endereço do remetente fica acessível quando o ouvinte recebe dados.
Eu presumo que você estará usando o UDP para isso?
fonte
Se você precisar encontrar apenas uma porta livre para uso posterior , veja um trecho semelhante a uma resposta anterior , mas mais curto, usando o socketserver :
Observe que a porta não é garantida para permanecer livre, portanto, você pode precisar colocar esse trecho e o código usando-o em um loop.
fonte