A estrutura da soja

A estrutura da soja

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_in
curto sin_family;
sin_port curto não assinado;
struct in_addr sin_addr;
char sin_zero [8];
;

Descriçã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;
my_struct.sin_port = htons (porta);

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 ().

#incluir
#incluir
#incluir
#incluir
void main ()

char ip [inet_addrstrlen] = "";
Char Addr [200] = "192.168.1.1 ";
struct sockaddr_in *my_struct;
// converte a string para endereço.
inet_pton (af_inet, addr, & my_struct);
// converte endereço em string.
inet_ntop (af_inet, & my_struct, ip, inet_addrstrlen);
printf ("\ n \ nip endereço: %s \ n \ n", ip);

A 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:

#incluir
#incluir
#incluir
#incluir
#incluir
int main ()
struct sockaddr_in my_struct;
struct hostent *host_ent;
host_ent = gethostbyname ("www.Google.com ");
bcopy ((char *) host_ent-> h_addr, (char *) & my_struct.sin_addr.s_addr,
sizeof (host_ent-> h_length));
printf ("Endereço IP: %S \ n", INT_NTOA (MY_STRUCT.sin_addr));

Dessa 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.