logo

Programmazione socket in C/C++

Nel mondo di oggi, le reti di computer svolgono un ruolo importante nel campo del trasferimento dei dati. È un argomento che ogni programmatore dovrebbe conoscere. Nella rete di computer, la programmazione dei socket è uno degli argomenti più importanti nel mondo della programmazione. In questo argomento discuteremo della programmazione socket e del diverso metodo di programmazione socket implementato in C++.

In C++, la programmazione socket è un metodo che combina due o più nodi tra loro su una rete in modo che i nodi possano condividere i dati senza alcuna perdita di dati. In questo caso, un nodo ascolta una porta connessa a un particolare indirizzo IP. Quando il client raggiunge il server, il server crea il listener del socket.

Cos'è una presa?

Comprendiamo il socket parlando dell'esempio in tempo reale. Una presa è un tipo di supporto che fornisce una connessione tra due dispositivi. La presa può essere un caricabatterie del telefono che fornisce la connessione tra la presa e il telefono o tra il telefono e il laptop. Con l'aiuto di un socket si collegano diverse applicazioni alla rete locale con porte diverse. Ogni volta che viene creato il socket, il server specifica il programma e quel programma specifica il socket e l'indirizzo del dominio.

Il socket è un tipo di meccanismo utilizzato per scambiare dati tra diversi processi. Qui questi processi sono presenti in dispositivi diversi o nello stesso dispositivo collegati in rete. Una volta creata la connessione per il socket, i dati possono essere inviati in entrambe le direzioni e continuano finché uno degli endpoint non chiude la connessione.

Programmazione socket in C/C++

Procedura nella comunicazione client-server

Ci sono alcune procedure che dobbiamo seguire per stabilire la comunicazione client-server. Questi sono i seguenti.

    PRESA:Con l'aiuto di una presa possiamo creare una nuova comunicazione.Legamento:Con l'aiuto di questo possiamo collegare l'indirizzo locale al socket.Ascoltare:Con questo aiuto; possiamo accettare la connessione.Accettare:Con questo aiuto; possiamo bloccare la connessione in entrata fino all'arrivo della richiesta.Collegare:Con questo aiuto; possiamo tentare di stabilire la connessione.Inviare:Con l'aiuto di questo; possiamo inviare i dati sulla rete.Ricevere:Con questo aiuto; possiamo ricevere i dati sulla rete.Vicino:Con l'aiuto di questo, possiamo rilasciare la connessione dalla rete.

Fasi per la creazione del socket del server

Ci sono alcune fasi attraverso le quali possiamo creare il socket per il server. Questi sono i seguenti.

    int socketcr:Socket(dominio, tipo, protocollo)Presa:È un tipo intero ed è come un gestore di file.Dominio:È un dominio di comunicazione ed è di tipo intero.Tipo:È un tipo di comunicazione.CALZINO_DGRAMMA:È un tipo di UDP inaffidabile e senza connessione.Protocollo:Viene utilizzato per assegnare il valore del protocollo per l'indirizzo IP, che è 0. Il valore del protocollo è simile al valore che appare nel campo protocollo dell'intestazione IP del pocket.

Cos'è una connessione?

Una connessione è un tipo di relazione tra due macchine in cui i due software sono conosciuti l'uno dall'altro. Questi due software sanno come stabilire una connessione tra loro; in altre parole possiamo dire che questi due software sanno come inviare i bit in rete. Una connessione tramite socket significa che le due macchine dovrebbero conoscere tutte le informazioni tra loro, come il numero di telefono, l'indirizzo IP e la porta TCP.

Un socket è un tipo di oggetto simile al file che consente al programma di accettare la connessione in entrata e consentirgli di inviare o ricevere la connessione in entrata. Inoltre, è un tipo di risorsa assegnata al processo del server.

Il server può creare il socket con l'aiuto di socket(). Questo socket non può essere condiviso con nessun altro processore.

    Setsockopt:Con l'aiuto di Setsockopt, possiamo manipolare le varie opzioni del socket, a cui fa riferimento il descrittore di file del socket. Questo processo è completamente facoltativo. Con l'aiuto di Setsockopt possiamo riutilizzare la porta e l'indirizzo del client e del server. Quando il server restituisce l'errore 'indirizzo già in uso', possiamo prevenirlo con l'aiuto di Setsockopt.Legamento:Possiamo associare il socket con l'indirizzo e la porta con l'aiuto della funzione bind. Questa operazione viene eseguita dopo la creazione del socket. Ad esempio, se proviamo a collegare il server all'host locale, utilizziamo INADDR_ANY per definire l'indirizzo IP del server.Ascoltare:Possiamo creare una presa in modalità connessione con l'aiuto della funzione ascolto (). Un esempio di socket della modalità di connessione è SOCK_STREAM. Questo può essere definito dall'argomento socket. Viene utilizzato per accettare la connessione in entrata, eseguire l'operazione di coda per la connessione in entrata ed eseguire il backlog della connessione in entrata. Quando una connessione in entrata richiede il riconoscimento al server, il socket viene messo in modalità passiva. Il parametro backlog del server si riferisce al fatto che non può consentire più di una connessione alla volta al server. Se è arrivata una connessione in entrata e la coda è piena, il server fornisce l'errore con l'indicazione 'ECONREFUSED'. Con l'aiuto di listen(), la connessione in entrata viene sospesa e, quando la coda è vuota, chiama tutte le connessioni in entrata al server.Accettare:Con l'aiuto della chiamata di sistema accetta(); possiamo creare il socket basato sulla connessione. Alcuni socket basati sulla connessione sono SOCK_STREAM e SOCK_SEQPACKET. Estrae tutte le connessioni in entrata che arrivano per prime e consente alla loro richiesta di andare al server. La lista appena connessa non è in grado di ascoltare con l'aiuto di un altro argomento per la creazione del nuovo socket.

Fasi per il Cliente

    Collegamento presa:È esattamente lo stesso metodo per la creazione del server.Collegare:Possiamo avviare una connessione al socket con l'aiuto della chiamata di sistema connect(). Se il parametro per il socket è del tipo SOCK_DGRAM, allora possiamo definire il datagramma come permanente con l'aiuto di connect(). Se il socket è di tipo SOCK_STREAM, possiamo tentare di stabilire un'altra connessione per il server. Con l'aiuto della funzione connect() possiamo anche creare una connessione per l'associazione straniera. Se il socket non è associato, il sistema assegna il valore univoco all'associazione locale. Quando il sistema chiama completato con successo, il socket è pronto per inviare o ricevere qualsiasi tipo di dati.Invia Ricevi:Le funzioni send() e recv() possono eseguire l'operazione seguente.
  • La presa su cui i dati possono essere comunicati tra loro.
  • Il buffer di archiviazione può memorizzare dati sull'indirizzo, come addr_of_data e addr_of_buffer.
  • Si occupa della dimensione del buffer, come len_of_data e len_of_buffer.
  • Si tratta del flag che dice come verranno inviati i dati.

Passaggi per stabilire la connessione nel socket

Stabilisce una connessione tra i diversi client e il server. Ma sia il client che il server possono gestire la connessione socket. Ogni processo deve stabilire una connessione per il proprio socket.

I passaggi necessari per stabilire un socket sul lato client sono i seguenti:

  • Crea un socket con l'aiuto di una chiamata di sistema socket().
  • Quindi dobbiamo connetterci con l'indirizzo socket del server con l'aiuto di una chiamata system().
  • Quindi dobbiamo inviare e ricevere i dati. Possiamo farlo in vari modi. possiamo fare questa funzione read() e write().

I passaggi necessari per stabilire un socket sul lato server sono i seguenti:

  • Per prima cosa crea un socket con l'aiuto di una chiamata di sistema socket().
  • Quindi associa il socket a un indirizzo con l'aiuto della chiamata di sistema bind(). Un indirizzo è costituito da un numero di porta per il socket del server nella macchina host.
  • Quindi ascolta la connessione con l'aiuto della chiamata di sistema listening ().
  • Quindi il server accetta la connessione in entrata con l'aiuto della chiamata di sistema accetta(). Blocca inoltre tutti i comandi in entrata finché un client non viene connesso a un server.
  • Quindi inizia il processo di invio e ricezione dei dati.

Connessione di più client senza multithreading

Ci sono vari esempi in cui vediamo come un singolo utente può connettersi al server. Nel mondo della programmazione di oggi, più utenti sono collegati al server con prese diverse.

Esistono vari modi per raggiungere questo obiettivo. Uno di questi è il multithreading. Con l'aiuto del multithreading, possiamo raggiungere questo obiettivo. Possiamo implementare un processo multithreading con l'aiuto della funzione select().

Esempio:

Codice per il cliente:

 // 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)>