Somente um uso de cada soquete é normalmente permitido

3

Tentando escutar em uma porta já usada (por exemplo, executando duas instâncias do mesmo servidor de soquete) no Windows:

[WinError 10048] Only one usage of each socket address (protocol/network address/port) is normally permitted

Estou confuso porque somente um uso de cada endereço é normalmente permitido. Fiquei com a impressão de que isso era uma regra absoluta (pelo menos no Unix), mas aparentemente não. Em que casos (e como) poderia haver dois programas usando o mesmo endereço de soquete? Ou estou interpretando mal este erro?

    
por baum 25.06.2018 / 19:53

1 resposta

3

Não é uma regra absoluta em todos os sistemas UNIX. Alguns possuem extensões que permitem que vários processos se vinculem à mesma combinação de endereço e porta, e o kernel manipulará a distribuição de conexões de entrada para vários ouvintes. A vantagem disso é que seu aplicativo não precisa manipular as conexões em si, e pode se preocupar em lidar com conexões, o que, por sua vez, oferece um mecanismo rápido e muito fácil de implementar para permitir o paralelismo em seu código de rede. / p>

No Linux, a opção de soquete para isso é chamada de SO_REUSEPORT , e muitos softwares de servidor de alto desempenho amplamente utilizados (incluindo o Apache HTTPD e o nginx) suportam o uso.

O Windows, por usar um clone amplamente direto do código de rede 4.4BSD, tem o mesmo conceito de opções de soquete, e tem suas próprias opções para controlar isso. De acordo com esta resposta do StackOverflow , a opção em questão é chamada SO_REUSEADDR , e há uma 'anti-opção' equivalente chamada SO_EXCLUSIVEADDRUSE .

É importante notar que não há nada que impeça que vários programas diferentes usem essa opção e vinculem-se à mesma porta. Isso pode levar a todos os tipos de dores de cabeça ao depurar problemas de rede e também é uma consideração de segurança bastante significativa.

    
por 25.06.2018 / 20:58