Q: How many processes can listen on a specific port?
R: todos quantos você pode gerar.
No entanto, para SOCK_STREAM
sockets, e a menos que você use a opção SO_REUSEPORT
(nova no Linux 3.9), um processo não pode ligar um soquete a um terminal local (endereço + porta para TCP, nome de arquivo para Unix .. .) se já houver outro soquete vinculado a ele (ou um de escuta nessa porta com o endereço curinga).
Portanto, a menos que você use SO_REUSEPORT, a única maneira de ter processos diferentes escutando na mesma porta é ter seus descritores de arquivo correspondentes apontando para a mesma descrição do arquivo aberto (para o mesmo soquete). / p>
Isso acontece automaticamente quando você usa fork()
de um processo. Se o fd 3 apontar para um soquete TCP de escuta no endereço curinga e na porta 12345, ambos os processos após a bifurcação estarão escutando nessa porta naquele fd (sintaxe zsh
abaixo):
$ zmodload zsh/net/tcp
$ ztcp -ld 3 12345
$ sleep 10 &
$ lsof -ni tcp:12345
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
zsh 26277 stephane 3u IPv4 506354 0t0 TCP *:12345 (LISTEN)
sleep 26988 stephane 3u IPv4 506354 0t0 TCP *:12345 (LISTEN)
Para processos que não estão relacionados, a única maneira (que eu sei) de um processo para obter acesso a esse soquete de escuta seria usar o SCM_RIGHT
mechanism para passar fds (na verdade mais como descrições de arquivos abertos ) entre processos usando sockets de domínio unix.
Você notará que um argumento para listen()
é o backlog .
Assim que houver um soquete escutando em determinado endpoint, o kernel começará a aceitar conexões de entrada para esse endpoint ( o backlog é uma dica para o kernel quanto a quantos podem aceitar que não foram accept
ed por aplicativos ).
Em seguida, o primeiro processo que executa accept()
em qualquer um dos fds que apontam para o soquete de escuta (ou qualquer um dos soquetes de escuta com SO_REUSEPORT
) obterá a conexão de entrada. accept()
cria um novo soquete e retorna um novo fd para esse socket
. Por sua vez, esse fd pode ser duplicado (um novo fd apontando para o mesmo socket) e os processos filhos herdarão o soquete conectado como se estivessem ouvindo.