C Connect Function System Call

C Connect Function System Call

Nella lingua C, stabilire una connessione client-server tramite una presa richiede diversi passaggi e funzioni. Alcuni di questi vengono utilizzati per recuperare i dati dal server a cui si desidera connettersi, altri vengono utilizzati per creare gli indirizzi socket o convertire.

Sebbene non vi sia alcun ordine particolare, questa serie di passaggi e chiamate di funzione deve essere effettuata in un ordine perché i loro risultati sono utilizzati negli argomenti di input della funzione successiva.

In questo Suggerimento Linux Articolo, imparerai come usare il Collegare() Funzionare e creare una presa da zero per connettersi da remoto a un server.

Iniziamo con una descrizione della sintassi, gli argomenti di input e output che compongono questa funzione e una spiegazione teorica di come funziona. Quindi, esamineremo un esempio che mostra il processo passo-passo su come creare e connettere una presa.

Poiché l'utilizzo di questa funzione richiede una conoscenza delle strutture di dati che costituiscono i suoi argomenti di input, in una sezione speciale esamineremo la sua composizione, il tipo di dati dei suoi membri e i parametri che lo definiscono in ciascuno.

Sintassi della funzione Connect () in lingua C

int connect (int Sockfd, struct Sockaddr *serv_addr, int addrlen)

Descrizione della funzione Connetti in lingua C

La funzione Connect () stabilisce la connessione di una presa tra un client e un server.

Questa funzione collega il socket, il cui descrittore è Sockfd, al server e il cui indirizzo è memorizzato nella struttura Serv_addr, che ha una lunghezza di addrlen.

Se la connessione ha esito positivo, connect () restituisce 0 come risultato e se la connessione non può essere stabilita, -1.

Di seguito è riportata una descrizione dettagliata di ciascun argomento di input e il suo scopo nella funzione Connect ().

Sockfd: Questo è un numero intero con il descrittore di socket. Questo descrittore è il risultato restituito dalla funzione socket () e viene utilizzato per connettere, inviare e ricevere dati dal server.

serv_addr: Questo è il puntatore a una struttura di tipo Sockaddr che memorizza l'indirizzo del server a cui connettersi.

Addrlen: Questa è la dimensione del membro dell'array sa_data della struttura Sockaddr, dove l'indirizzo, il numero di porta, ecc. sono immagazzinati.

Passaggi prima di chiamare la funzione Connect () per connettersi a un server.

La chiamata alla funzione Connect () è l'ultima di una serie di passaggi necessari per stabilire una connessione di successo. Questi passaggi consistono nella definizione delle variabili e delle strutture che le funzioni utilizzeranno: creazione di un socket e ottenere l'indirizzo IP del server che vogliamo connettere ecc. Spieghiamo in cinque passaggi come creare una presa e collegarla a un server utilizzando la funzione Connect ().

Come creare, configurare e collegare un socket passo dopo passo da zero nella lingua C

Passo 1: Nel primo passaggio includeremo le seguenti intestazioni e definiremo le seguenti variabili:

#includere
#includere
#includere
#includere
#includere
#includere
#includere
#includere
int socket_id;
int port = 80;
Errore int;
Char Buffer [1025);

L'intero Socket_id è l'identificatore della presa attraverso la quale viene effettuata una connessione e attraverso la quale vengono inviati e ricevuti i dati. La variabile porta Specifica il numero di porta della presa. In questo caso 80 per il servizio HTTP e l'intero errore viene utilizzato per rilevare errori nelle varie funzioni.

Quindi definiremo il puntatore a una struttura di tipo Hostent di nome server e uno di tipo Sockaddr_in di nome cliente. Queste strutture archiviano informazioni come indirizzi IP, tipo di connessione, ecc. Quelli di tipo Hostent archiviano le informazioni sul server, mentre quelle di tipo Sockadrr_in memorizzare i dati della connessione. Usiamo la funzione Memcpy () per cancellare tutti i dati nella struttura dell'ospedale.

Struct hostent *server;
Struct Sockaddr_in Client;
memcpy (& server, 0, sizeof (server));

Passo 2: Una volta definita la struttura dell'ospedente, il passo successivo è determinare l'indirizzo IP del nome host a cui vogliamo connetterci. Per questo, C fornisce diverse funzioni che possono risolvere un indirizzo. In questo esempio, useremo gethostByName (). Questa funzione restituisce a Hostent Struttura con i dati di dominio passati nell'argomento di input come stringa o un puntatore ad esso. IL Se la condizione interromperà la connessione in caso di errore, ad esempio un nome di dominio inesistente.

server_id = gethostByName ("www.Google.com ");
if (server_id == null)

printf ("\ nerror ottenendo dati di dominio.\N");
Ritorno 1;

Passaggio 3: Crea una presa Sockket_id E ottieni il suo identificatore. La funzione Socket () restituisce l'identificatore del socket creato in base alla famiglia, al tipo e al protocollo di connessione degli indirizzi. In questo caso, Af _inet, calzino _stream per una connessione IP4 e TCP.

socket_id = socket (af_inet, Sock_stream, 0);

Passaggio 4: Impostare la configurazione della connessione in Sockaddr_in struttura. Per fare ciò, accedere ai suoi membri e assegnare loro valori per specificare il servizio e indirizzare la famiglia. Il numero di porta è specificato in formato binario diretto e pertanto deve essere convertito usando la funzione htons ().

In questo esempio, imposteremo AF_inet nel sin_family campo per indirizzi IPv4 e in sin_port Assegniamo la porta 80 per il servizio "http".

cliente.sin_family = af_inet;
cliente.sin_port = htons (porta);

Passaggio 5: Il prossimo passo è copiare l'indirizzo da server struttura al cliente Struttura da utilizzare come indirizzo di connessione per la presa. Un modo per farlo è usare la funzione bcopy () come segue:

bcopy ((char *) server-> h_addr,
(char *) e client.sin_addr.s_addr,
sizeof (server-> h_length));

Copia l'indirizzo nella struttura Sockaddr, che viene utilizzato dalla funzione Connect () come argomento di input per serv_addr.

Lo facciamo da un lancio di strutture e per salvare righe di codice. Lo faremo nella funzione Call to the Connect () nell'argomento di input serv_addr.

Di seguito, puoi vedere come convertire correttamente le informazioni del cliente struttura:

(struct Sockaddr *) & client, sizeof (client))

Quindi, chiama la funzione Connect () e passa l'identificatore Socket_id Come il primo argomento. Come secondo argomento, il Sockaddr struttura e infine le dimensioni della struttura.

L'intero errore viene superato come argomento di input, che utilizziamo per verificare se la connessione ha avuto successo. Il seguente snippet mostra come chiamare la funzione Connect () e verificare se ha avuto successo:

errore = connect (socket_id, (struct sockaddr *) & client, sizeof (client));
If (Errore H_ADDR,
(char *) e client.sin_addr.s_addr,
sizeof (server-> h_length));
errore = connect (socket_id, (struct sockaddr *) & client, sizeof (client));
if (errore <0)
printf ("\ nco non potrebbe stabilire la connessione al server \ n");
chiudere (socket_id);
Ritorno 1;

printf ("\ nconnectto: %s \ n", inet_ntoa (client.sin_addr));

L'immagine mostra la compilazione e l'esecuzione del codice in cui si collega al "www.Google.com "server. Questo codice stabilisce la connessione e quindi chiude l'applicazione disconnettendo.

Il seguente snippet utilizza le funzioni FGETS () per immettere le stringhe tramite la console di comando e le funzioni di invio () e recv () per inviare comandi HTTP al server e ricevere la risposta:

while (1)
printf ("Per uscire da premi ctrl+c \ nsend http comando:");
fgets (buffer, 1025, stdin);
inviare (socket_id, buffer, 1025, 0);
memset (& buffer, '\ 0', 1025);
recv (socket_id, buffer, 1025, 0);
printf ("%s", buffer);
memset (& buffer, '\ 0', 1025);

L'immagine che vediamo di seguito mostra l'esecuzione del codice completo con l'invio del comando HTTP "Get" e la risposta del server:

La struttura Sockaddr_in

Strutture di tipo Sockaddr_in Archivia la configurazione del tipo di connessione e dell'indirizzo. I loro membri vengono utilizzati per specificare la famiglia, l'indirizzo da utilizzare e il numero di porta.

Di seguito, puoi vedere questo tipo di struttura insieme a un elenco dettagliato di ciascun membro:

struct Sockaddr_in

Short int sin_family;
Short int non firmato Sin_port;
struct in_addr sin_addr;
char sin_zero non firmato [8];
;

sin_family: Questo numero intero specifica una delle opzioni familiari da restituire dal server. Le opzioni della famiglia Indirizzo sono:

AF_INET per indirizzi IPv4.

AF_INET6 per indirizzi IPv6.

sin_port: Imposta il numero di porta del servizio da utilizzare.

sin_addr: Questa è l'abbreviazione per l'indirizzo Internet. Questa è una struttura di tipo in_addr in cui viene memorizzato l'indirizzo Internet.

sin_zero: Questo è un array di 8 caratteri non firmati con il valore 0, che fungono da imbottitura per compensare la dimensione di 14 byte della struttura Sockaddr.

La struttura ospitante

Questo tipo di struttura memorizza i dati utili forniti dal server quando viene effettuata una query con funzioni come Gethostbynam (). Queste prequerie di connessione socket risolvono gli indirizzi e le informazioni di restituzione come il nome di dominio, la famiglia degli indirizzi e un elenco di indirizzi se esiste più di uno. Di seguito puoi vedere questa struttura insieme a una descrizione dettagliata di ciascun elemento:

struct hostent

char *h_name;
char ** h_aliases;
int h_addrtype;
int h_length;
char ** h_addr_list;
#define h_addr h_addr_list [0]
;

h_name: Questo è un puntatore a una stringa con il nome di dominio per il quale è stato interrogato.

H_ALIASES: Questo è un elenco di nomi alternativi.

H_ADDRTYPE: Questo membro specifica la famiglia degli indirizzi per la quale è stata interrogata.

h_length: Questo specifica la dimensione dell'indirizzo.

h_addr_list: Questo è il puntatore a un elenco di puntatori dell'indirizzo. Se il server restituisce più di un indirizzo per il nome interrogato, si accede a ciascuno tramite questo puntatore dell'elenco.

h_addr : Questa struttura definisce H_ADDR come un puntatore al primo indirizzo nel h_addr_list, Quindi l'accesso è attraverso questa definizione.

Conclusione

In questo Suggerimento Linux Articolo, abbiamo spiegato tutto sul Collegare() funzione nella lingua C.

Abbiamo esaminato la sintassi di questa funzione, nonché i tipi di argomenti e strutture che utilizza nei suoi input. Inoltre, abbiamo spiegato passo dopo passo come creare una presa e connetterci a un server remoto utilizzando questa funzione.

Affinché tu abbia una conoscenza più profonda delle prese in questo lingua.