logo

Socket-Programmierung in C/C++

In der heutigen Welt spielen Computernetzwerke eine wichtige Rolle im Bereich der Datenübertragung. Es ist ein Thema, das jeder Programmierer kennen sollte. Unter dem Computernetzwerk ist die Socket-Programmierung eines der wichtigsten Themen in der Programmierwelt. In diesem Thema besprechen wir die Socket-Programmierung und die verschiedenen Methoden der Socket-Programmierung, die in C++ implementiert sind.

In C++ ist die Socket-Programmierung eine Methode, die zwei oder mehr Knoten über ein Netzwerk miteinander verbindet, sodass die Knoten die Daten ohne Datenverlust gemeinsam nutzen können. Dabei lauscht ein Knoten auf einem Port, der mit einer bestimmten IP-Adresse verbunden ist. Wenn der Client den Server erreicht, erstellt der Server den Socket-Listener.

Was ist eine Steckdose?

Lassen Sie uns den Socket anhand eines Echtzeitbeispiels verstehen. Ein Socket ist eine Art Medium, das eine Verbindung zwischen zwei Geräten herstellt. Bei der Steckdose kann es sich entweder um ein Telefonladegerät handeln, das die Verbindung zwischen der Steckdose und dem Telefon herstellt, oder zwischen dem Telefon und dem Laptop. Mit Hilfe eines Sockets werden unterschiedliche Anwendungen über unterschiedliche Ports an das lokale Netzwerk angeschlossen. Jedes Mal, wenn der Socket erstellt wird, gibt der Server das Programm an, und dieses Programm gibt den Socket und die Domänenadresse an.

Der Socket ist eine Art Mechanismus, der zum Datenaustausch zwischen verschiedenen Prozessen verwendet wird. Dabei sind diese Prozesse entweder in verschiedenen Geräten vorhanden oder im selben Gerät, die über ein Netzwerk verbunden sind. Sobald die Verbindung für den Socket hergestellt ist, können die Daten in beide Richtungen gesendet werden und werden fortgesetzt, bis einer der Endpunkte die Verbindung schließt.

Socket-Programmierung in C/C++

Vorgehensweise in der Client-Server-Kommunikation

Es gibt einige Verfahren, die wir befolgen müssen, um eine Client-Server-Kommunikation herzustellen. Diese lauten wie folgt.

    Steckdose:Mit Hilfe eines Sockets können wir eine neue Kommunikation herstellen.Binden:Mit dieser Hilfe können wir die lokale Adresse mit dem Socket verknüpfen.Hören:Mit dieser Hilfe; Wir können die Verbindung akzeptieren.Akzeptieren:Mit dieser Hilfe; Wir können die eingehende Verbindung blockieren, bis die Anfrage eintrifft.Verbinden:Mit dieser Hilfe; wir können versuchen, die Verbindung herzustellen.Schicken:Mit dieser Hilfe; Wir können die Daten über das Netzwerk senden.Erhalten:Mit dieser Hilfe; Wir können die Daten über das Netzwerk empfangen.Schließen:Mit dessen Hilfe können wir die Verbindung aus dem Netzwerk lösen.

Phasen für die Server-Socket-Erstellung

Es gibt einige Phasen, in denen wir den Socket für den Server erstellen können. Diese lauten wie folgt.

SMTP-Internetprotokoll
    int socketcr:Socket (Domäne, Typ, Protokoll)Socketcr:Es ist ein ganzzahliger Typ und ähnelt einem Dateihandler.Domain:Es handelt sich um eine Kommunikationsdomäne und einen ganzzahligen Typ.Typ:Es handelt sich um einen Kommunikationstyp.SOCK_DGRAM:Es handelt sich um einen UDP-Typ, der unzuverlässig und verbindungslos ist.Protokoll:Es wird verwendet, um den Protokollwert für die IP-Adresse zuzuweisen, der 0 ist. Der Protokollwert ähnelt dem Wert, der im Protokollfeld des IP-Headers des Pocket erscheint.

Was ist eine Verbindung?

Eine Verbindung ist eine Art Beziehung zwischen zwei Maschinen, bei der die beiden Softwareprogramme voneinander wissen. Diese beiden Softwareprogramme wissen, wie sie eine Verbindung zueinander herstellen. Mit anderen Worten: Wir können sagen, dass diese beiden Softwareprogramme wissen, wie die Bits über das Netzwerk gesendet werden. Eine Verbindung des Sockets bedeutet, dass die beiden Maschinen alle Informationen untereinander kennen sollten, wie z. B. die Telefonnummer, die IP-Adresse und den TCP-Port.

Ein Socket ist ein Objekttyp, der einer Datei ähnelt und es dem Programm ermöglicht, die eingehende Verbindung zu akzeptieren und die eingehende Verbindung zu senden oder zu empfangen. Außerdem handelt es sich um einen Ressourcentyp, der dem Serverprozess zugewiesen ist.

Der Server kann den Socket mit Hilfe von socket() erstellen. Dieser Sockel kann nicht mit einem anderen Prozessor geteilt werden.

    Setsockopt:Mit Hilfe von Setsockopt können wir die verschiedenen Optionen des Sockets manipulieren, auf die der Dateideskriptor des Sockets verweist. Dieser Vorgang ist völlig optional. Mit Hilfe von Setsockopt können wir den Port und die Adresse des Clients und des Servers wiederverwenden. Wenn der Server den Fehler „Adresse bereits verwendet“ meldet, können wir dies mit Hilfe von Setsockopt verhindern.Binden:Mit Hilfe der Bind-Funktion können wir den Socket mit der Adresse und dem Port binden. Dieser Vorgang wird nach der Erstellung des Sockets ausgeführt. Wenn wir beispielsweise versuchen, den Server mit dem lokalen Host zu verbinden, verwenden wir INADDR_ANY, um die IP-Adresse des Servers zu definieren.Hören:Mit Hilfe der Funktion „Listening to ()“ können wir einen Verbindungsmodus-Socket erstellen. Ein Beispiel für einen Verbindungsmodus-Socket ist SOCK_STREAM. Dies kann durch das Socket-Argument definiert werden. Dies wird verwendet, um die eingehende Verbindung zu akzeptieren, den Warteschlangenvorgang für die eingehende Verbindung durchzuführen und den Rückstand der eingehenden Verbindung auszuführen. Wenn eine eingehende Verbindung eine Bestätigung vom Server anfordert, wird der Socket in den passiven Modus versetzt. Der Backlog-Parameter des Servers bezieht sich auf die Tatsache, dass er nicht mehr als eine Verbindung gleichzeitig zum Server zulassen kann. Wenn eine eingehende Verbindung eingegangen ist und die Warteschlange voll ist, meldet der Server den Fehler mit der Meldung „ECONNREFUSED“. Mit Hilfe von listen() wird die eingehende Verbindung gehalten und wenn die Warteschlange leer ist, werden alle eingehenden Verbindungen zum Server aufgerufen.Akzeptieren:Mit Hilfe des Systemaufrufs „accept()“; Wir können den verbindungsbasierten Socket erstellen. Einige verbindungsbasierte Sockets sind SOCK_STREAM und SOCK_SEQPACKET. Es extrahiert alle eingehenden Verbindungen, die zuerst eingehen, und ermöglicht deren Anfrage, an den Server weitergeleitet zu werden. Die neu verbundene Liste ist nicht in der Lage, mit Hilfe eines anderen Arguments auf die Erstellung des neuen Sockets zu hören.

Bühnen für den Kunden

    Steckdosenanschluss:Es ist genau das gleiche wie die Methode zur Erstellung des Servers.Verbinden:Mithilfe des Systemaufrufs connect() können wir eine Verbindung zum Socket herstellen. Wenn der Parameter für den Socket vom Typ SOCK_DGRAM ist, können wir das Datagramm mit Hilfe von connect() als permanent definieren. Wenn der Socket vom Typ SOCK_STREAM ist, können wir versuchen, eine weitere Verbindung für den Server herzustellen. Mit Hilfe der Funktion connect() können wir auch eine Verbindung für den Fremdverband herstellen. Wenn der Socket ungebunden ist, weist das System der lokalen Zuordnung den eindeutigen Wert zu. Wenn das System den Aufruf erfolgreich abgeschlossen hat, ist der Socket bereit, beliebige Datentypen zu senden oder zu empfangen.Senden empfangen:Die Funktionen send() und recv() können den folgenden Vorgang ausführen.
  • Der Socket, über den die Daten miteinander kommuniziert werden können.
  • Der Speicherpuffer kann Daten über die Adresse speichern, z. B. addr_of_data und addr_of_buffer.
  • Es befasst sich mit der Größe des Puffers, wie len_of_data und len_of_buffer.
  • Es handelt sich um das Flag, das angibt, wie die Daten gesendet werden.

Schritte zum Herstellen der Verbindung im Socket

Es stellt eine Verbindung zwischen den verschiedenen Clients und dem Server her. Aber sowohl der Client als auch der Server können die Socket-Verbindung verarbeiten. Jeder Prozess muss eine Verbindung für seinen eigenen Socket herstellen.

Die Schritte zum Einrichten eines Sockets auf der Clientseite sind wie folgt:

  • Es erstellt einen Socket mit Hilfe eines socket()-Systemaufrufs.
  • Dann müssen wir uns mit Hilfe eines system()-Aufrufs mit der Socket-Adresse des Servers verbinden.
  • Dann müssen wir die Daten senden und empfangen. Wir können dies auf verschiedene Arten tun. Wir können diese read()- und write()-Funktion ausführen.

Die Schritte zum Einrichten eines Sockets auf der Serverseite sind wie folgt:

  • Zunächst wird mit Hilfe eines socket()-Systemaufrufs ein Socket erstellt.
  • Anschließend bindet es den Socket mit Hilfe des Systemaufrufs bind() an eine Adresse. Eine Adresse besteht aus einer Portnummer für den Server-Socket im Host-Computer.
  • Dann lauscht es mit Hilfe des Systemaufrufs listen() auf die Verbindung.
  • Anschließend akzeptiert der Server die eingehende Verbindung mit Hilfe des Systemaufrufs „accept()“. Außerdem werden alle eingehenden Befehle blockiert, bis ein Client mit einem Server verbunden ist.
  • Dann beginnt der Prozess des Sendens und Empfangens von Daten.

Mehrere Clients ohne Multithreading verbinden

Es gibt verschiedene Beispiele, in denen wir sehen, wie sich ein einzelner Benutzer mit dem Server verbinden kann. In der heutigen Programmierwelt sind mehrere Benutzer über unterschiedliche Sockets mit dem Server verbunden.

Es gibt verschiedene Möglichkeiten, dies zu erreichen. Einer davon ist Multithreading. Mit Hilfe von Multithreading können wir dies erreichen. Mithilfe der Funktion select() können wir einen Multithreading-Prozess implementieren.

Beispiel:

Code für den Kunden:

 // Client side C/C++ program to demonstrate Socket // programming #include #include #include #include #include #define PORT 8080 int main(int argc, char const* argv[]) { int sock = 0, valread, client_fd; struct sockaddr_in serv_addr; char* hello = &apos;Hello from client&apos;; char buffer[1024] = { 0 }; if ((sock = socket(AF_INET, SOCK_STREAM, 0)) <0) 0 8080 { printf('
 socket creation error 
'); return -1; } serv_addr.sin_family="AF_INET;" serv_addr.sin_port="htons(PORT);" convert ipv4 and ipv6 addresses from text to binary form if (inet_pton(af_inet, '127.0.0.1', &serv_addr.sin_addr) <="0)" printf( '
invalid address not supported ((client_fd="connect(sock," (struct sockaddr*)&serv_addr, sizeof(serv_addr))) 0) printf('
connection failed send(sock, hello, strlen(hello), 0); printf('hello message sent
'); valread="read(sock," buffer, 1024); printf('%s
', buffer); closing the connected close(client_fd); 0; code for server: server side c c++ program demonstrate programming #include #define port int main(int argc, char const* argv[]) server_fd, new_socket, valread; struct sockaddr_in address; opt="1;" addrlen="sizeof(address);" buffer[1024]="{" }; char* hello="Hello from server" ; creating file descriptor ((server_fd="socket(AF_INET," sock_stream, 0)) perror('socket failed'); exit(exit_failure); forcefully attaching (setsockopt(server_fd, sol_socket, so_reuseaddr | so_reuseport, &opt, sizeof(opt))) perror('setsockopt'); address.sin_family="AF_INET;" address.sin_addr.s_addr="INADDR_ANY;" address.sin_port="htons(PORT);" (bind(server_fd, sockaddr*)&address, sizeof(address)) perror('bind (listen(server_fd, 3) perror('listen'); ((new_socket="accept(server_fd," (socklen_t*)&addrlen)) perror('accept'); send(new_socket, close(new_socket); listening shutdown(server_fd, shut_rdwr); pre> <p> <strong>Compiling:</strong> </p> <img src="//techcodeview.com/img/c-tutorial/33/socket-programming-c-c-2.webp" alt="Socket Programming in C/C++"> <p> <strong>Output:</strong> </p> <img src="//techcodeview.com/img/c-tutorial/33/socket-programming-c-c-3.webp" alt="Socket Programming in C/C++"> <h2>Uses of Socket Programming</h2> <p>Socket programs are used to communicate between various processes, usually running on different systems. It is mostly used to create a client-server environment. This post provides the various functions used to create the server and client program and an example program.</p> <p>In the example, the client program sends a file name to the server, and the server sends the contents of the file back to the client. Socket programming usually pertains to basic communication protocols like TCP/UDP and raw sockets like ICMP. These protocols have a small communication overhead when compared to underlying protocols such as HTTP/DHCP/SMTP etc.</p> <p> <strong>Some of the basic data communications between the client and server are:</strong> </p> <ul> <li>File Transfer: Sends name and gets a file.</li> <li>Web Page: Sends URL and gets a page.</li> <li>Echo: Sends a message and gets it back.</li> </ul> <h2>Disadvantages</h2> <ul> <li>C++ can establish communication only with the machine requested and not with any other machine on the network.</li> <li>Sockets allow only raw data to be sent. This means that the client and server need mechanisms to interpret the data.</li> </ul> <hr></0)>