Cos'è la programmazione socket?
La programmazione socket è un modo per connettere due nodi su una rete per comunicare tra loro. Un socket (nodo) è in ascolto su una particolare porta su un IP, mentre l'altro socket si collega all'altro per formare una connessione. Il server forma il socket del listener mentre il client raggiunge il server.
Diagramma di stato per il modello server e client

Diagramma di stato per il modello server e client di Socket
Fasi per Server
Il server viene creato utilizzando i seguenti passaggi:
modello di progettazione del metodo di fabbrica
1. Creazione del socket
int sockfd = socket(domain, type, protocol)>
- sockfd: descrittore del socket, un numero intero (come un handle di file) dominio: intero, specifica il dominio di comunicazione. Utilizziamo AF_ LOCAL come definito nello standard POSIX per la comunicazione tra processi sullo stesso host. Per comunicare tra processi su host diversi collegati tramite IPV4, utilizziamo AF_INET e AF_I NET 6 per processi collegati tramite IPV6. tipo: tipo di comunicazione
SOCK_STREAM: TCP (affidabile, orientato alla connessione)
SOCK_DGRAM: protocollo UDP (inaffidabile, senza connessione): valore del protocollo per Internet Protocol (IP), che è 0. Questo è lo stesso numero che appare nel campo del protocollo nell'intestazione IP di un pacchetto. (protocolli man per maggiori dettagli)
2. Setsockopt
Questo aiuta a manipolare le opzioni per il socket a cui fa riferimento il descrittore di file sockfd. Questo è completamente facoltativo, ma aiuta a riutilizzare l'indirizzo e la porta. Previene errori come: indirizzo già in uso.
int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen);>
3. Rilegare
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);>
Dopo la creazione del socket, la funzione bind associa il socket all'indirizzo e al numero di porta specificati in addr(struttura dati personalizzata). Nel codice di esempio, colleghiamo il server al localhost, quindi utilizziamo INADDR_ANY per specificare l'indirizzo IP.
4. Ascolta
int listen(int sockfd, int backlog);>
Mette il socket del server in modalità passiva, dove attende che il client si avvicini al server per stabilire una connessione. Il backlog definisce la lunghezza massima alla quale può crescere la coda delle connessioni in sospeso per sockfd. Se arriva una richiesta di connessione quando la coda è piena, il client potrebbe ricevere un errore con l'indicazione ECONNREFUSED.
5. Accetta
int new_socket= accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);>
Estrae la prima richiesta di connessione sulla coda delle connessioni in sospeso per il socket in ascolto, sockfd, crea un nuovo socket connesso e restituisce un nuovo descrittore di file che fa riferimento a quel socket. A questo punto viene stabilita la connessione tra client e server e sono pronti per trasferire i dati.
Fasi per il Cliente
1. Collegamento presa: Esattamente uguale a quello della creazione del socket del server
2. Connetti: La chiamata di sistema connect() collega il socket a cui fa riferimento il descrittore di file sockfd all'indirizzo specificato da addr. L'indirizzo e la porta del server sono specificati in addr.
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);>
Implementazione
Qui stiamo scambiando un messaggio di saluto tra server e client per dimostrare il modello client/server.
Programma C per creare server
Server.c
C
conversione di stringa in numero intero in Java
// Server side C program to demonstrate Socket> // programming> #include> #include> #include> #include> #include> #include> #define PORT 8080> int> main(>int> argc,>char> const>* argv[])> {> >int> server_fd, new_socket;> >ssize_t valread;> >struct> sockaddr_in address;> >int> opt = 1;> >socklen_t addrlen =>sizeof>(address);> >char> buffer[1024] = { 0 };> >char>* hello =>'Hello from server'>;> >// Creating socket file descriptor> >if> ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) <0) {> >perror>(>'socket failed'>);> >exit>(EXIT_FAILURE);> >}> >// Forcefully attaching socket to the port 8080> >if> (setsockopt(server_fd, SOL_SOCKET,> >SO_REUSEADDR | SO_REUSEPORT, &opt,> >sizeof>(opt))) {> >perror>(>'setsockopt'>);> >exit>(EXIT_FAILURE);> >}> >address.sin_family = AF_INET;> >address.sin_addr.s_addr = INADDR_ANY;> >address.sin_port = htons(PORT);> >// Forcefully attaching socket to the port 8080> >if> (bind(server_fd, (>struct> sockaddr*)&address,> >sizeof>(address))> ><0) {> >perror>(>'bind failed'>);> >exit>(EXIT_FAILURE);> >}> >if> (listen(server_fd, 3) <0) {> >perror>(>'listen'>);> >exit>(EXIT_FAILURE);> >}> >if> ((new_socket> >= accept(server_fd, (>struct> sockaddr*)&address,> >&addrlen))> ><0) {> >perror>(>'accept'>);> >exit>(EXIT_FAILURE);> >}> >valread = read(new_socket, buffer,> >1024 - 1);>// subtract 1 for the null> >// terminator at the end> >printf>(>'%s
'>, buffer);> >send(new_socket, hello,>strlen>(hello), 0);> >printf>(>'Hello message sent
'>);> >// closing the connected socket> >close(new_socket);> >// closing the listening socket> >close(server_fd);> >return> 0;> }> |
>
>
Programma C per creare client
cliente.c
C
rinominare una directory linux
// Client side C program to demonstrate Socket> // programming> #include> #include> #include> #include> #include> #define PORT 8080> int> main(>int> argc,>char> const>* argv[])> {> >int> status, valread, client_fd;> >struct> sockaddr_in serv_addr;> >char>* hello =>'Hello from client'>;> >char> buffer[1024] = { 0 };> >if> ((client_fd = socket(AF_INET, SOCK_STREAM, 0)) <0) {> >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/ Address not supported
'>);> >return> -1;> >}> >if> ((status> >= connect(client_fd, (>struct> sockaddr*)&serv_addr,> >sizeof>(serv_addr)))> ><0) {> >printf>(>'
Connection Failed
'>);> >return> -1;> >}> >send(client_fd, hello,>strlen>(hello), 0);> >printf>(>'Hello message sent
'>);> >valread = read(client_fd, buffer,> >1024 - 1);>// subtract 1 for the null> >// terminator at the end> >printf>(>'%s
'>, buffer);> >// closing the connected socket> >close(client_fd);> >return> 0;> }> |
>
>
Produzione
Client:Hello message sent Hello from server Server:Hello from client Hello message sent>
Compilazione
gcc client.c -o client gcc server.c -o server>
Successivo: Programmazione socket in C/C++: gestione di più client sul server senza multi threading