Copy Link
Add to Bookmark
Report

Vana Imago 2 21

eZine's profile picture
Published in 
Vana Imago
 · 5 years ago

  

                                            ÕÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͸                                               ³  :::::::::::::::::::::::::::  |                                               ÆÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͵                                               ³ Titolo: Corso di C - IV Parte ³                                               ÆÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͵                                               ³ di : Techno Knight            ³                                               ÆÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͵                                               ³ Scritto il  : 20/5/99         ³                                               ÆÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͵                                               ³ Pericolo: Û°°°°°°°°°          ³                                               ÔÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ;                                                                                               ___                                                                            / __|                                                                          ³ /                                                                             ³ \__       _  __    __                                                          \___|     ³ ³ \ \  / /                                                                    ³ ³  \ \/ /                                                                     |_|   \__/                                                                                                                                                                                                                   CORSO DI C - IV PUNTATA - by Techno Knight                                                                                                                                                                                                                                                                                   PREMESSA                                                                        --------                                                                        Al contrario delle precedenti 3 puntate questa non la troverete su Newbies      ma su Vana Imago, perchŠ purtroppo N0body88 (che mi ha convinto a scrivere      le prime puntate di questo corso) non Š + in rete per dei problemi (le          solite voci dicono che sia rinchiuso in una prigione di massima sicurezza       negli Stati Uniti), e da quello che mi Š sembrato di capire, anche a causa      degli esami di maturit… Newbies 4 ci metter… un p• ad uscire, e dato che        su irc molte persone mi dicevano che dovevo fare al + presto la quarta          puntata xchŠ senno' mi ammazzavano, allora ho deciso di farla uscire prima.                                                                                     Nella III puntata ho cominciato a parlare dei socket e come si usano per        applicazioni client. Ovviamente adesso per finire di spiegare questo            argomento devo insegnarvi ad usarli per applicazioni server.                    Per seguire questa puntata dovrete aver letto le precedenti, perchŠ non         mi soffermer• + sulla sintassi del linguaggio ne sulle cose di base             riguardanti i socket, che dovreste gi… aver imparato dalla scorsa lezione.                                                                                      Allora un'applicazione server dovr… "ascoltare" su una porta aspettando         una connessione da parte di un client. Quando un client cerca di collegarsi     il server dovr… accettare la connessione e poi duplicare il processo :          da una parte continuer… ad ascoltare sulla porta per ulteriori connessioni,     dall'altra si preoccuper… di portare avanti la comunicazione con il client      gi… collegato (per duplicare il processo useremo la funzione fork(),            includendo nel nostro programma unistd.h)                                       Allora, per prima cosa creiamoci un socket (beh spero che avrete letto la       III puntata, se non l'avete fatto leggetela), poi useremo la funzione           bind sul socket.                                                                                                                                                Sintassi:                                                                                                                                                               int bind(int socket, struct sockaddr *indirizzo, int lunghezza);                                                                                        socket Š il socket da utilizzare (quello che vi siete creati precedentemente),  indirizzo Š la struttura sockaddr che contiene i parametri del socket           lunghezza Š la dimensione di indirizzo.                                         Se si verifica un errore ritorna -1.                                                                                                                            La funzione listen invece serve per mettere in ascolto il socket sulla porta    specificando il numero massimo di connessioni contemporanee che si possono      accettare.                                                                                                                                                      Sintassi:                                                                                                                                                               int listen(int socket,int mass);                                                                                                                        socket Š ovviamente il socket e mass il numero massimo di connessioni da        accettare.                                                                                                                                                      Quando arriver… una richiesta di connessione dal client dovremo accettarla      e per farlo usiamo la funzione accept.                                                                                                                          Sintassi:                                                                                                                                                               int accept(int socket,struct sockaddr *indirizzo, int lunghezza);                                                                                       socket Š il socket che stiamo usando, indirizzo punta a una struttura sockaddr  che verr… riempita con i dati del client che si sta collegando al nostro        server e lunghezza la dimensione di indirizzo.                                  Questa funzione ritorna un valore che Š il descriptor del nuovo socket          con il quale possiamo comunicare con il client.                                 E come al solito ecco l'esempiuccio.                                            Questo Š un programmino (eheh siate clementi, l'ho fatto solo per farvi         un esempio :) che funziona come una specie di segreteria.                       Per compilarlo semplicemente "cc server.c -o server"                            Per usarlo (ihihih) : "server [messaggio] [porta]"                              Il programma ascolter… sulla porta [porta] e a chi si collegher… dar…           il messaggio [messaggio], poi aspetter… un input, lo scriver… nel file          /tmp/azzzz e chiuder… la connessione per aspettarne altre.                      Es. server "Lascia un messaggio stronzone." 1224                                E' in grado di gestire una sola connessione alla volta, per gestirne +          contemporaneamente dovete solo usare il fork in modo che si duplichi            ogni volta che accetta una nuova connessione.                                                                                                                   #include <sys/socket.h>                                                         #include <sys/types.h>                                                          #include <netinet/in.h>                                                         #include <netdb.h>                                                              #include <unistd.h>                                                             #include <stdio.h>                                                              int s,s2;                                                                       char io[200];                                                                   struct sockaddr_in me;                                                          struct sockaddr_in te;                                                          struct hostent *hp;                                                             char stringa[1024],registra[1024];                                              FILE *ilfile;                                                                                                                                                   main(int argc,char *argv[]){                                                                                                                                            bzero(me,sizeof me);                                                            gethostname(io,199);                                                            hp = gethostbyname(io);                                                         me.sin_family=hp->h_addrtype;                                                   me.sin_port=htons(atoi(argv[2]));                                               strcpy(stringa,argv[1]);                                                        strcat(stringa,"\n\r");                                                                                                                                         s = socket(AF_INET,SOCK_STREAM,0);                                              bind(s,(struct sockaddr *)&me,sizeof me);                                       listen(s,3);                                                                    for (;;){                                                                               s2=accept(s,NULL,NULL);                                                         send(s2,stringa,strlen(stringa),0);                                             recv(s2,registra,1024,0);                                                       close(s2);                                                                      ilfile=fopen("/tmp/azzzz","a+");                                                fprintf(ilfile,"%s\n",registra);                                                fclose(ilfile);                                                                                                                                         }                                                                                                                                                       }                                                                                                                                                                                                                                                                                                                                                       Techno Knight (techno83@freemail.it)                                                                                                    

← previous
next →
loading
sending ...
New to Neperos ? Sign Up for free
download Neperos App from Google Play
install Neperos as PWA

Let's discover also

Recent Articles

Recent Comments

Neperos cookies
This website uses cookies to store your preferences and improve the service. Cookies authorization will allow me and / or my partners to process personal data such as browsing behaviour.

By pressing OK you agree to the Terms of Service and acknowledge the Privacy Policy

By pressing REJECT you will be able to continue to use Neperos (like read articles or write comments) but some important cookies will not be set. This may affect certain features and functions of the platform.
OK
REJECT