C Verbindungsfunktionssystemanruf

C Verbindungsfunktionssystemanruf

In der C-Sprache erfordert die Erstellung einer Kunden-Server-Verbindung über einen Sockel mehrere Schritte und Funktionen. Einige davon werden verwendet, um Daten von dem Server abzurufen, mit dem Sie eine Verbindung herstellen möchten.

Obwohl es keine bestimmte Reihenfolge gibt, müssen diese Reihe von Schritten und Funktionsaufrufen in einer Reihenfolge durchgeführt werden, da ihre Ergebnisse in den Eingabeargumenten der nachfolgenden Funktion verwendet werden.

In diesem Linux -Hinweis Artikel, Sie werden lernen, wie man das benutzt verbinden() Funktionieren und erstellen.

Wir beginnen mit einer Beschreibung der Syntax, der Eingabe- und Ausgabeargumente, die diese Funktion ausmachen, und eine theoretische Erklärung, wie sie funktioniert. Anschließend werden wir uns ein Beispiel ansehen, das Schritt-für-Schritt-Prozess zum Erstellen und Verbinden einer Steckdose zeigt.

Da die Verwendung dieser Funktion das Wissen über die Datenstrukturen erfordert, aus denen ihre Eingabemargente ausmachen, werden wir in einem speziellen Abschnitt seine Zusammensetzung, den Datentyp seiner Mitglieder und die Parameter, die sie in jedem definieren, betrachten.

Syntax der Funktion Connect () in C -Sprache

Int Connect (int sockfd, struct sockaddr *serv_addr, int addrlen)

Beschreibung der Verbindungsfunktion in der C -Sprache

Die Funktion Connect () stellt die Verbindung eines Socket zwischen einem Client und einem Server her.

Diese Funktion verbindet den Socket, dessen Deskriptor Sockfd ist, mit dem Server und dessen Adresse in der DEV_ADDR -Struktur gespeichert ist, die eine Länge von ADDRLEN hat.

Wenn die Verbindung erfolgreich ist, gibt Connect () 0 als Ergebnis zurück und wenn die Verbindung nicht hergestellt werden kann, -1.

Im Folgenden finden Sie eine detaillierte Beschreibung jedes Eingabarguments und ihres Zwecks in der Funktion Connect ().

Sockfd: Dies ist eine Ganzzahl mit dem Socket -Deskriptor. Dieser Deskriptor ist das Ergebnis, das von der Funktion Socket () zurückgegeben wird und zum Verbinden, Senden und Empfangen von Daten vom Server verwendet wird.

Serv_addr: Dies ist der Zeiger auf eine Struktur vom Typ Sockaddr, der die Adresse des Servers speichert, um eine Verbindung herzustellen.

ADDRLEN: Dies ist die Größe des Array -Mitglieds sa_data der Struktur Sockaddr, wo die Adresse, die Portnummer usw. sind gelagert.

Schritte vor dem Aufrufen der Funktion Connect (), um eine Verbindung zu einem Server herzustellen.

Der Aufruf zur Funktion Connect () ist die letzte von einer Reihe von Schritten, die erforderlich sind, um eine erfolgreiche Verbindung herzustellen. Diese Schritte bestehen darin, die Variablen und Strukturen zu definieren, die die Funktionen verwenden: Erstellen eines Sockets und das Erhalten der IP -Adresse des Servers, den wir verbinden möchten, usw. Wir erläutern in fünf Schritten, wie Sie einen Socket erstellen und ihn über die Funktion Connect () an einen Server verbinden.

So erstellen, konfigurieren und verbinden Sie einen Socket Schritt für Schritt von Grund auf neu in der C -Sprache

Schritt 1: Im ersten Schritt werden wir die folgenden Header einschließen und die folgenden Variablen definieren:

#enthalten
#enthalten
#enthalten
#enthalten
#enthalten
#enthalten
#enthalten
#enthalten
int socket_id;
int port = 80;
Im Terror;
Zeichenpuffer [1025);

Die ganze Zahl socket_id ist die Kennung des Sockets, durch den eine Verbindung hergestellt wird und durch die Daten gesendet und empfangen werden. Die Variable Hafen Gibt die Portnummer der Socket an. In diesem Fall 80 für Service HTTP und die Ganzzahl Fehler wird verwendet, um Fehler in den verschiedenen Funktionen zu erkennen.

Dann definieren wir den Zeiger auf eine Struktur des Typs Gastgeber genannt Server und eine vom Typ SOCKADDR_IN genannt Klient. Diese Strukturen speichern Informationen wie IP -Adressen, Verbindungstyp usw. Diejenigen vom Typ Hostent speichern die Serverinformationen, während diejenigen vom Typ sind SOCKADRR_IN Speichern Sie die Datendaten. Wir verwenden die Funktion memcpy (), um alle Daten in der hostenten Struktur zu löschen.

Struct hostent *server;
struct sockaddr_in client;
memcpy (& server, 0, sizeof (server));

Schritt 2: Sobald die häusliche Struktur definiert ist, besteht der nächste Schritt darin, die IP -Adresse des Hostnamens zu bestimmen, mit dem wir eine Verbindung herstellen möchten. Zu diesem Zweck bietet C mehrere Funktionen, mit denen eine Adresse behoben werden kann. In diesem Beispiel werden wir GetHostByName verwenden (). Diese Funktion gibt a zurück Gastgeber Struktur mit den Domänendaten, die im Eingabeargument als Zeichenfolge oder Zeiger darauf übergeben wurden. Der Wenn Die Bedingung brechen die Verbindung bei einem Fehler, beispielsweise eines nicht existierenden Domänennamens.

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

printf ("\ nError erhalten Domänendaten.\N");
Rückkehr 1;

Schritt 3: Erstellen Sie eine Steckdose SOCKKET_ID Und holen Sie sich seine Kennung. Die Funktion Socket () gibt die Kennung des erstellten Sockets basierend auf der Adressfamilie, dem Typ und dem Verbindungsprotokoll zurück. In diesem Fall AF _Inet, Sock _stream für eine IP4- und TCP -Verbindung.

SOCKKET_ID = SOCKKET (AF_INET, SOCK_STREAM, 0);

Schritt 4: Legen Sie die Verbindungskonfiguration in der SOCKADDR_IN Struktur. Zu diesem Zeitpunkt greifen Sie auf seine Mitglieder zu und weisen Sie ihnen Werte zu, um den Service anzugeben und die Familie zu beheben. Die Portnummer ist im direkten Binärformat angegeben und muss daher mit der Funktion htons () konvertiert werden.

In diesem Beispiel werden wir af_inet in der festlegen Sin_family Feld für IPv4 -Adressen und in sin_port Wir weisen Port 80 für den HTTP -Dienst zu.

Klient.sin_family = af_inet;
Klient.sin_port = htons (port);

Schritt 5: Der nächste Schritt besteht darin, die Adresse aus dem zu kopieren Server Struktur zum Klient Struktur, die als Verbindungsadresse für den Socket verwendet werden soll. Eine Möglichkeit, dies zu tun, besteht darin, die Funktion bcopy () wie folgt zu verwenden:

bcopy ((char *) server-> h_addr,
(Char *) & Kunde.SIN_ADDR.S_ADDR,
sizeof (server-> h_length));

Kopieren Sie die Adresse in die Struktur Sockaddr, die von der Funktion Connect () als Eingabeargument für verwendet wird Serv_addr.

Wir machen das von a gießen von Strukturen und um Codezeilen zu retten. Wir werden dies im Aufruf zur Funktion Connect () im Eingabeargument tun Serv_addr.

Im Folgenden können Sie sehen, wie Sie die Informationen der korrekt konvertieren können Klient Struktur:

(Struct Sockaddr *) & Client, sizeof (Client))

Rufen Sie als nächstes die Funktion Connect () auf und übergeben Sie die Kennung socket_id als erstes Argument. Als das zweite Argument, die Sockaddr Struktur und schließlich die Größe der Struktur.

Die ganze Zahl Fehler wird als Eingabeargument übergeben, mit dem wir prüfen, ob die Verbindung erfolgreich war. Das folgende Snippet zeigt, wie Sie die Funktion Connect () aufrufen und prüfen, ob es erfolgreich war:

error = connect (socket_id, (struct sockaddr *) & client, sizeof (client));
If (Fehler H_ADDR,
(Char *) & Kunde.SIN_ADDR.S_ADDR,
sizeof (server-> h_length));
error = connect (socket_id, (struct sockaddr *) & client, sizeof (client));
if (Fehler <0)
printf ("\ n kann nicht eine Verbindung zum Server \ n" herstellen);
close (socket_id);
Rückkehr 1;

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

Das Bild zeigt die Kompilierung und Ausführung des Code.Google.com "Server. Dieser Code stellt die Verbindung her und schließt dann die Anwendung durch Trennung.

Das folgende Snippet verwendet die Funktionen fGets (), um Zeichenfolgen über die Befehlskonsole und die Funktionen Send () und Recv () einzugeben, um HTTP -Befehle an den Server zu senden und die Antwort zu empfangen:

während (1)
printf ("zum Beenden drücken Sie Strg+c \ nSend HTTP -Befehl:");
FGets (Buffer, 1025, Stdin);
send (socket_id, puffer, 1025, 0);
memset (& buffer, '\ 0', 1025);
recv (socket_id, puffer, 1025, 0);
printf ("%S", Puffer);
memset (& buffer, '\ 0', 1025);

Das Bild, das wir unten sehen, zeigt die Ausführung des vollständigen Code mit dem Senden des Befehls http „get“ und der Antwort des Servers:

Die Struktur der Sockaddr_in

Strukturen des Typs SOCKADDR_IN Speichern Sie die Konfiguration des Verbindungstyps und der Adresse. Ihre Mitglieder werden verwendet, um die Familie, die zu verwendende Adresse und die Portnummer anzugeben.

Im Folgenden können Sie diesen Strukturtyp zusammen mit einer detaillierten Liste jedes Mitglieds sehen:

struct sockaddr_in

kurze int sin_family;
nicht signiertes kurzes int sin_port;
struktur in_addr sin_addr;
nicht signiertes char sin_zero [8];
;

Sin_family: Diese Ganzzahl gibt eine der Familienoptionen an, die vom Server zurückgegeben werden sollen. Die Adressfamilienoptionen sind:

AF_INET für IPv4 -Adressen.

AF_INET6 für IPv6 -Adressen.

sin_port: Legt die Portnummer des Dienstes fest.

SIN_ADDR: Dies ist die Abkürzung für die Internetadresse. Dies ist eine Struktur vom Typ in_Addr, in dem die Internetadresse gespeichert ist.

Sin_Zero: Dies ist ein Array von 8 nicht signierten Zeichen mit dem Wert 0, der als Polsterung dient, um die 14 Bytesgröße der Sockaddr -Struktur auszugleichen.

Die häusliche Struktur

Diese Art von Struktur speichert nützliche Daten, die vom Server bereitgestellt werden, wenn eine Abfrage mit Funktionen wie Gethostbynam () erstellt wird. Diese Prequerien für Socket -Verbindung lösen Adressen und Rückgabeinformationen wie den Domain -Namen, die Adressfamilie und eine Liste von Adressen zurück, wenn mehr als eins vorhanden ist. Im Folgenden sehen Sie diese Struktur zusammen mit einer detaillierten Beschreibung jedes Elements:

strukturiert häuslich

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: Dies ist ein Zeiger auf eine Zeichenfolge mit dem Domänennamen, für den er abgefragt wurde.

H_ALIASS: Dies ist eine Liste alternativer Namen.

H_ADDRTYPE: Dieses Mitglied gibt die Adressfamilie an, für die es befragt wurde.

H_Length: Dies gibt die Größe der Adresse an.

H_ADDR_LIST: Dies ist der Zeiger auf eine Liste von Adresszeigern. Wenn der Server mehr als eine Adresse für den befragten Namen zurückgibt, wird über diesen Listenzeiger auf jeden zugegriffen.

H_ADDR : Diese Struktur definiert H_ADDR als Zeiger auf die erste Adresse in der H_ADDR_LIST, Der Zugriff erfolgt also durch diese Definition.

Abschluss

In diesem Linux -Hinweis Artikel, wir haben alles über die erklärt verbinden() Funktion in der C -Sprache funktionieren.

Wir haben uns die Syntax dieser Funktion sowie die Argumente und Strukturen angesehen, die sie in ihren Eingaben verwendet. Außerdem haben wir Schritt für Schritt erklärt, wie Sie einen Socket erstellen und mit dieser Funktion eine Verbindung zu einem Remote -Server herstellen können.

Damit Sie in dieser Sprache ein tieferes Wissen über Sockelkenntnisse haben können, haben wir einen speziellen Abschnitt erstellt, der die von Socket -Funktionen verwendeten Strukturen erläutert, wobei jedes ihrer Mitglieder die Funktion, die sie in den Eingabeargumenten der verschiedenen Funktionen ausführen, beschrieben haben.