anche Bane si chiede: non è un Blog di Cinema questo, neh? |
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <errno.h> #define MYBUFSIZE 1024 int main(int argc, char *argv[]) { // test argomenti if (argc != 3) { // errore args printf("%s: numero argomenti errato\n", argv[0]); printf("uso: %s host port [i.e.: %s 127.0.0.1 9999]\n", argv[0], argv[0]); return EXIT_FAILURE; } // crea un socket int my_socket; if ((my_socket = socket(AF_INET, SOCK_STREAM, 0)) < 0) { // errore socket() printf("%s: could not create socket (%s)\n", argv[0], strerror(errno)); return EXIT_FAILURE; } // prepara la struttura sockaddr_in per il server remoto struct sockaddr_in server; // (remote) server socket info server.sin_family = AF_INET; server.sin_addr.s_addr = inet_addr(argv[1]); server.sin_port = htons(atoi(argv[2])); // connessione al server remoto if (connect(my_socket, (struct sockaddr *)&server, sizeof(server)) < 0) { // errore connect() printf("%s: connect failed (%s)\n", argv[0], strerror(errno)); return EXIT_FAILURE; } // loop di comunicazione col server remoto for (;;) { // compone messaggio per il server remoto char my_msg[MYBUFSIZE]; printf("Scrivi un messaggio per il Server remoto: "); scanf("%s", my_msg); // send messaggio al server remoto if (send(my_socket, my_msg, strlen(my_msg), 0) < 0) { // errore send() printf("%s: send failed (%s)\n", argv[0], strerror(errno)); return EXIT_FAILURE; } // riceve una risposta dal server remoto memset(my_msg, 0, MYBUFSIZE); if (recv(my_socket, my_msg, MYBUFSIZE, 0) < 0) { // errore recv() printf("%s: recv failed (%s)\n", argv[0], strerror(errno)); return EXIT_FAILURE; } // mostra la risposta printf("%s: Server reply: %s\n", argv[0], my_msg); } // esco con Ok return EXIT_SUCCESS; }Ok, come vedete è ampiamente commentato e quindi è auto-esplicativo, per cui non mi dilungherò sulle singole istruzioni e/o gruppi di istruzioni (leggete i commenti! sono li per quello!), ma aggiungerò, solo, qualche dettaglio strutturale.
la struttura è quella classica e basica di un Socket Client:
- socket() - crea un socket
- prepara la struttura sockaddr_in per il server remoto
- connect() - connessione al server remoto
- send() + recv() - loop di comunicazione col server remoto
Per quanto riguarda il flusso e lo stile del main() valgono le note elencate nel post sul Server. Per testarlo è sufficiente aprire due terminali (UNIX o Linux, ovviamente), e avviare in uno il Server e nell'altro il Client; se proviamo in una macchina sola il Client deve, come è logico, collegarsi al Server su localhost. Per l'argomento port si può usare un numero qualsiasi scelto tra quelli non riservati (e bisogna usare lo stesso port per Client e Server!) Il risultato sarà il seguente:
terminale 1 (Server):
aldo@linux-nb:~/blogtest$ ./socket_server 9999 ./socket_server: attesa connessioni entranti... ./socket_server: ricevuto messaggio dal sock 4: pippo ./socket_server: ricevuto messaggio dal sock 4: pluto ./socket_server: client disconnectedterminale 2 (Client):
aldo@linux-nb:~/blogtest$ ./socket_client 127.0.0.1 9999 Scrivi un messaggio per il Server remoto: pippo ./socket_client: Server reply: mi hai scritto: pippo Scrivi un messaggio per il Server remoto: pluto ./socket_client: Server reply: mi hai scritto: pluto Scrivi un messaggio per il Server remoto: ^CCome si nota il Client e il Server si parlano e quando il Client si scollega (con un brutale Ctrl-C) il Server se ne accorge. Missione compiuta!
Ciao e al prossimo post!
Nessun commento:
Posta un commento