A programação do soquete na linguagem C usa uma variedade de funções, muitas delas são usadas para resolver, converter e determinar o endereço do servidor para o qual queremos conectar. Sem dúvida, o endereço IP é a informação mais importante de que precisamos quando abrimos um soquete. E lidar com esses endereços exige que conheçamos as estruturas em que são armazenadas, o tipo de dados de cada um de seus membros, etc.
Nisso Artigo de dica do Linux, Você aprenderá tudo sobre o tipo de Socaddr_in Estruturas usadas por funções do sistema para armazenar endereços para conexões da Internet.
Veremos uma descrição teórica de seus membros e o tipo de dados para cada um deles. Vamos aprender a criar um Sockaddr_in Estruture e depois recupere, converta e armazene os endereços nesse tipo de estrutura para estabelecer uma conexão de soquete bem -sucedida.
Também explicaremos as semelhanças com a estrutura Sockaddr e como converter dados de um para o outro, pois essa é uma etapa necessária para usar a função Connect () e conectar -se ao servidor.
Sintaxe da estrutura da soja na linguagem C
struct sockaddr_inDescrição da estrutura Sockaddr_in na linguagem C
Estruturas do tipo Sockaddr_in destinam -se a armazenar o endereço do servidor nas conexões da Internet e ser compatível em tamanho e ordem de dados com uma estrutura de demão usada pela função Connect () para conectar -se a um servidor.
Os dados armazenados nessas estruturas especificam a família de endereços, o número da porta e o endereço IP do servidor. Em seguida, vemos a lista de membros do Sockaddr_in estrutura e uma descrição de cada membro:
sin_family: Este é um curto que especifica o tipo de família de endereços que a estrutura contém. Essas opções de família de endereços são as seguintes:
AF_INET: Especifica a família de endereço IPv4.
AF_INET6: Especifica a família de endereço IPv6.
sin_port: é um Ushort que especifica o número da porta que o soquete usará. Como endereços, o número da porta não é codificado, o que significa que deve ser especificado em formato binário direto; portanto, uma conversão para esse tipo de dados deve ser feita para atribuir um valor a ele.
in_add: Esta é uma estrutura cujo membro é um uint32_t onde cada um de seus 4 bytes corresponde a um campo do endereço IPv4 do servidor da Internet com o qual o soquete deve ser aberto. Como o número da porta, o endereço nesta estrutura deve ser especificado em formato binário puro.
sin_zero: Esta é uma matriz de 8 caracteres cujo único objetivo é equilibrar o tamanho da estrutura com uma estrutura do tipo Sockaddr.
Como declarar uma estrutura de soja na linguagem C na linguagem
Para declarar um Sockaddr_in estrutura, escreva em uma linha de código “estrutura”Seguido pelo tipo. Nesse caso, Sockaddr_in E então o “Nome da estrutura" ou "* Nome da estrutura”Para declarar o ponteiro. A sintaxe para declarar um Sockaddr_in A estrutura é a seguinte:
struct sockaddr_in *my_struct;Como definir o número da porta em uma estrutura de soja na linguagem C
O número da porta deve ser especificado em forma binária direta no membro sin_port da estrutura. Portanto, é necessário converter o valor para este tipo de dados.
O htons () A função é mais comumente usada para esse fim. Ele converte o valor inteiro contido em seu argumento de entrada e retorna seu valor em formato binário direto à sua saída.
Em seguida, vamos ver como atribuir a porta 80 ao sin_port membro da estrutura declarada anteriormente:
int porta = 80;Como definir o endereço IP em uma estrutura de Sockaddr_in na linguagem C
Os endereços IP não são codificados, o que significa que cada um dos números em seus campos é representado por seu equivalente binário. Para trabalhar com eles, em certos casos, é necessário converter endereços IP em strings ou strings em endereços IP para atribuir ou consultar esses valores nas estruturas.
O idioma C fornece várias funções para converter strings para endereços e armazenar o resultado em determinadas estruturas.
O função inet_pton () é um dos mais comumente usados para esse fim. Está definido no cabeçalho “INET.h”E tem três argumentos de entrada. O primeiro deve especificar a família de endereços para converter, neste caso AF _inet.
O segundo argumento deve ser o ponteiro de uma string especificando o endereço IP, com cada campo separado por um período.
O terceiro argumento desta função deve ser o ponteiro de uma estrutura do tipo Sockaddr_in onde o endereço convertido é armazenado.
O inet_ntop () função faz a tarefa reversa, convertendo os endereços armazenados em um Sockaddr_in estrutura em cordas.
Em seguida, veremos como atribuir um endereço IP à estrutura My_Struct do Sockaddr_in digite de uma string, neste caso addr, usando o INT_PTON () função. Então, usamos o inet_ntop () função para converter o endereço de volta ao IP da string para exibi -lo no console de comando com printf ().
#incluirA imagem a seguir mostra o endereço IP que obtivemos da string addr. Então, voltamos com a função complementar inet_ntop () Para converter o endereço armazenado em my_struct em uma string para exibi -la no console de comando.
Como determinar o endereço IP de um domínio e armazená -lo em uma estrutura de Sockaddr_in na linguagem C
Para se conectar a um host, você primeiro precisa saber seu endereço. Em seguida, vamos ver como obter o endereço IP de um host e armazená -lo em um Sockaddr_in estrutura usando o Gethostbyname () função.
Essa função toma como seu único argumento de entrada uma string, ou um ponteiro, que especifica o nome do host cujo endereço deve ser determinado. Como resultado, Gethostbyname () Retorna uma estrutura do tipo hostent com todos os dados do domínio, incluindo o endereço IP.
Depois que as informações do host na estrutura hostente são recuperadas, o endereço obtido é copiado para o Sockaddr_in estrutura usando o função bcopy ().
Em seguida, vemos o código onde o Socaddr_in e as estruturas do tipo hostente são definidas. O IP endereço de "www.Google.com”Está determinado na última estrutura e copiado para o Sockaddr_in estrutura. Em seguida, o endereço determinado é convertido em uma string usando o inet_ntoa () e printf () funções e exibido no console de comando:
#incluirDessa forma, já armazenamos o endereço de “www.Google.com”Na estrutura do tipo Sockaddr_in. A figura abaixo mostra o endereço do host especificado no argumento de entrada do Gethostbyname () função.
Google.com tem vários endereços IP associados ao domínio; portanto, o resultado desse código pode diferir do resultado da imagem.
Como lançar uma estrutura de demora com os dados de uma estrutura de Sockaddr_in
O conectar() A função é a única função fornecida pelo idioma C para estabelecer conexões de soquete. Esta função usa estruturas do tipo Sockaddr Para especificar o endereço ao qual deseja se conectar.
A estrutura usada pelo conectar() A função tem o mesmo tamanho em bytes que uma estrutura do tipo Sockaddr_in mas difere no tipo de dados. Isso significa que uma estrutura elenco deve ser realizado para usar os dados de conexão armazenados no Sockaddr_in estrutura nesta função.
Esta operação simples pode ser realizada com a mesma chamada para o Função Connect () No segundo argumento de entrada, como mostrado abaixo:
conectar (soquete, (struct sockaddr *) e my_struct, sizeof (my_struct));Conclusão
Nisso Artigo de dica do Linux, Explicamos tudo o que você precisa saber sobre trabalhar com estruturas do tipo Sockaddr_in. Analisamos em detalhes o tipo e os dados de cada um de seus membros lojas.
Também mostramos como declarar esse tipo de estrutura e como usar as funções necessárias para obter, converter e manipular os diferentes dados armazenados por cada um de seus membros.
Para obter mais artigos sobre as dicas de idioma C e Linux, use o mecanismo de pesquisa em nosso site.