SO_REUSEADDR Soket Parâmetro

SO_REUSEADDR Soket Parâmetro

Você pode ter tentado muitas funções C, muitas funções da biblioteca Posix C e funções C baseadas em UNIX em seus programas. A maioria das funções C relacionadas a Posix ou redes usa alguns sinalizadores em seus parênteses como argumento ou usado para fins específicos. Você já tentou aprender algumas bandeiras embutidas durante a programação? Se não, está totalmente bem.

Discutiremos o uso da bandeira SO_REUSEADDR de C neste artigo. É uma bandeira do tipo booleano inteiro que especifica se a reutilização do endereço local deve ou não ser permitida pelas regras usadas para validar os endereços fornecidos no sistema de ligação chamadas. Isso significa que um soquete pode se ligar para os soquetes AF_INET, exceto a presença de um soquete de escuta ativo conectado ao endereço. Não é viável vincular a uma porta especificada de um soquete de escuta quando ela estiver configurada para inaddr_any para qualquer endereço local.

O método de ligação pode reutilizar o endereço local depois de usar a bandeira SO_REUSEADDR. Observe que o endereço local, que é composto por endereço IP e número da porta, significa que dois endereços locais podem coexistir em si se qualquer parte do número de IP ou porta for diferente e, portanto, não exigir a aplicação desse sinalizador. O endereço local não pode ser utilizado com este parâmetro se já tiver sido acessado por um soquete que está em um estado de audição. Quando o endereço local do soquete está no status de escuta e o componente IP do endereço é inaddr, todos os IPs locais são monitorados. A ligação não pode mais sustentar nenhum endereço local para esta porta, mesmo com este argumento.

Exemplo:

Aqui está o código do cliente usado para os clientes se conectarem ao servidor usando os dois endereços IP separados. O cliente no exemplo a seguir deseja se conectar ao servidor que está usando um número de porta diferente, mas o mesmo endereço IP. O endereço IP do host local e o valor da porta foram passados ​​para a função Connect_TCP na primeira chamada em que foram definidos como 8888.

No entanto, após a ligação ao endereço local, o sistema usou o domínio do soquete Unix para executar uma segunda conexão de soquete, onde o endereço IP permaneceu o mesmo, mas o número da porta foi alterado para 7777. Isso significa que um cliente está conectado a dois endereços de soquete diferentes em uma única solicitação TCP, o que é concebível porque os endereços são diferentes. Este código vincula à máquina alvo após a ligação do endereço local primeiro. As duas tentativas de ligação devem ser bem -sucedidas porque, como os programas acima mencionados, a parte IP dos endereços locais das duas conexões de ligação varia.

Utilizando um terminal da linha de comando Linux, compila o código usando o compilador GCC para o código de idioma C:

Usando o comando NCAT, imitamos o servidor:

Para visualizar cada status de soquete para a porta número 7777, use o comando SS:

A saída a seguir exibe o status do soquete para a porta número 7777:

Como visto na captura de tela Pevious, agora não há outra conexão e apenas o servidor NCAT está ouvindo na porta 7777. Depois de executar o arquivo de saída criado na etapa de compilação, execute -o.

Agora, execute o mesmo comando depois de executar o arquivo de saída do código anterior no terminal Linux. Observe que existem duas chamadas para Connect_TCP Connection, então quatro conexões são estabelecidas durante essas chamadas.

Agora que duas conexões são feitas com sucesso, uma usando 127.0.0.1 e porta 7777 e a outra usando a porta 8888, recebemos a seguinte saída. Existem quatro conexões no geral na tela a seguir, porque invocamos o método TCP Connect duas vezes:

Existem quatro conexões estaduais de Estado (Estabelecer), o que é normal porque a saída é do lado do servidor e do lado do cliente, respectivamente. As três primeiras linhas são escritas da perspectiva do servidor, enquanto os dois subsequentes são apresentados daquela do cliente. O nome do processo em segundo plano também mostra isso. Antes de ingressar, o cliente pode conectar muitos endereços IP locais, e o servidor pode fazer a mesma coisa usando um alvo. Pode se ligar a uma variedade de endereços locais antes de monitorar sem o argumento SO_REUSEADDR. Não iremos ilustrá -lo agora porque o código do software é semelhante. O código liga primeiro o endereço local ao endereço de destino, que é 127.0.0.1: 7777 ou 127.0.0.1: 7778, e depois execute uma conexão com esses endereços IP.

Quando executamos esse cliente, ele é exibido na tela o "endereço já em uso", indicando que o primeiro cliente tem esse endereço. O código anterior agora é modificado apenas adicionando mais algumas linhas do código para usar a bandeira So Reuseaddr. Desejamos conectar nosso cliente a um endereço de soquete semelhante que já é usado ou mantido por outro cliente. Aqui está o trecho de código do código modificado:

Usamos o editor do VIM para abrir o arquivo e adicionamos o código no modo de inserção.

Recompilar o código. Mas antes de fazer, observe o seguinte: Crie um novo arquivo ou utilize um existente e modifique o nome do arquivo de saída durante a compilação. Após a compilação, execute o arquivo de saída usando o terminal da linha de comando. Após a execução, podemos ver que um cliente está conectado ao mesmo endereço IP e número da porta em que nosso primeiro cliente foi conectado. Isso ocorre porque usamos a bandeira SO_REUSEADDR.

Conclusão

Trata -se do uso do parâmetro soqueddr SO_REUSEADDR, que é um sinalizador do tipo booleano na linguagem C. Vimos um exemplo usando o parâmetro de soquete SO_REUSEADDR para especificar se o endereço local reutilizado ou não em outros programas ou tópicos deve ser permitido pelas direções usadas para autenticar os endereços somente se no sistema de ligação chamadas.