/* bcopystru.c #include <memory.h> struct point int x; char *y; ; struct point a, b; struct pint *pta, *ptb; a.x = 5; a.y = pippo ; b = a; printf i valori del secondo point sono: %d %s\n,b.x,b.y); pta= struct point *) mallocsizeof struct point)); ptb= struct point *) mallocsizeof struct point)); pta->x)= 10; pta->y)= plutonio ; bcopypta, ptb, sizeofstruct point)); printf la dimensione di *pta e *ptb: %d %d\n, sizeof*pta), sizeof*ptb)); printf la dimensione di pta e ptb: %d %d\n, sizeofpta),sizeofptb)); printf i valori del primo point sono: %d %s\n,pta->x, pta->y); printf i valori del secondo point sono: %d %s\n,ptb->x, pta->y); printf i valori degli indirizzi pta->x, di ptb->:%d %d\n,&pta->x), &ptb->x)); printf i valori degli indirizzi pta->y e di ptb->y: %ld %ld\n, pta->y, ptb ->y); return0); i valori del secondo point sono:5 pippo la dimensione di *pta e *ptb: 8 8 la dimensione di pta e ptb: 4 4 i valori del primo point sono: 10 plutonio i valori del secondo point sono: 10 plutonio i valori degli indirizzi pta->x, di ptb->:33336 33352 i valori degli indirizzi pta->y e di ptb->y: 16626 16626
/* intoa.c #include <memory.h> #include <malloc.h> #include <netinet/in.h> /* Internet domain, e il file header piu aggiornato che riguarda l Internet, contiene la definizione di struct in_addr #include <arpa/inet.h> #include <netdb.h> /* contiene la definizione di struct hostent /* char * inet_ntoain) struct in_addr in; unsigned long inet_addrcp) char *cp; struct in_addr struct...; struct...; u_long s_addr; ); struct in_addr server; char *s; unsigned long a; server.s_addr= 255; s= inet_ntoaserver); printf indirizzo: %s\n, s); server.s_addr= 256; s= inet_ntoaserver); printf indirizzo: %s\n, s); server.s_addr= 65535; s= inet_ntoaserver); printf indirizzo: %s\n, s); s= 0.0.1.200 ; a= inet_addrs); printf indirizzo numerico: %u\n, a); returno0); /* prompt> cc intoa.c prompt> a.out indirizzo: 0.0.0.255 indirizzo: 0.0.1.0 indirizzo: 0.0.255.255 indirizzo numerico:456
/* pro.c mainargc, argv) int argc; char *argv; int port, porta; printf %s\n, argv[1]); port= atoiargv[2]); sscanfargv[2], %d, &porta); printf %d\n, port); printf %d\n, porta); return0); ) /* pro 34 89 34 89 89
/* cliu1.c /* Il programma da utilizzarsi in combinazione con servu1.c, genera un socket, nel dominio Unix, di nome endpoint2, attraverso il quale questo programma si mette in comunicazione con il socket, nel dominio di Unix, di nome endpoint1, generato dal programma servu1.c, per inviargli un messaggio dal programma cliu1.c e poi per ricevere un messaggio di risposta. Tale esempio mostra la bidirezionalita del socket endpoint2 #include <sys/un.h /* Unix domain #define BUFLEN 1024 char *msg = Richiesta di servizio dal cli_sock ; int s; int addrlen = sizeofstruct sockaddr_un); struct sockddr_un cli_sock; struct sockaddr_un aiuto; /* struct di appoggio che consente di fare la sendto char buf[buflen]; int cc; /* genera il socket nel dominio UNIX: s= socketaf_unix, SOCK_DGRAM, 0); if s== - 1) perror Client: socket\n ); else printf generazione del socket %d: ok\n, s); /* fai la bind: cli_sock.sun_family = AF_UNIX; strcpycli_sock.sun_path, endpoint2 ); if binds, &cli_sock, sozeofstruct sockaddr_un)) == -1 ) perror Client: bind\n ); /*trasmetti un messaggio attraverso il socket s verso il socket endpoint1 : aiuto.sun_family = AF_UNIX; strcpyaiuto,sun_path, endpoint1 ); if sentos,msg, strlenmsg) +1, 0, &aiuto, strlenaiuto.sun_path)+2) == -1 ) perror Client: error send\nn ); ) printf ATTESA DATI DAL SERVER \n ); /* leggi dal socket s: if cc= reads, buf, BUFLEN)) == -1 perror Client: read\n ); printf Client: ricevuto -> %s\n, buf); unlink endpoint2 )
/*servu1.c /* Il programma da utilizzarsi in combinazione con cliu1.c, genera un socket, nel dominio di Unix, di nome endpoint1, attraverso il quale questo programma si mette in comunicazione con il socket, nel dominio di Unix, di nome endpoint2, generato dal programma cliu1.c, per ricevere un messaggio dal programma cliu1.c e poi per inviargli un messaggio di risposta. Tale esempio mostra la bidirezionalita del socket endpoint1. #include <sys/un.h /* Unix domain #define BUFLEN 1024 char *msg = Messagio dal server ; int s; int addrlen = sizeofstruct sockaddr_un); struct sockaddr_un appoggio: /* struct di appoggio che consente di effettuare la recvfrom struct sockaddr_un serv_sock; char buf[buflen]; /* genera il socket nel dominio UNIX: s = socketaf_unix, SOCK_DGRAM, 0); if s == -1) perror Server: socket\n ); else printf generazione del socket %d: ok\n, s); /* fai la bind: serv_sock.sun_family = AF_UNIX; strcpyserv_sock.sun_path, endpoint1 ); if binds, &serv_sock, sizeofstruct sockaddr_un)) == -1 ) perror Server:bind\n ); /* metti il socket s in ricezione di cio che giunge da appoggio: if recvfroms, buf, BUFLEN, 0, &appoggio, &addrlen) == -1 ) perror Server: recvfrom\n ); printf MESSAGGIO DAL CLIENT: %s \n, buf); if sendtos, msg, strlenmsg) -1, 0, &appoggio, addrlen) == -1) perror Server: send\n ); unlink endpoint1 );
/* cliu11.c /* Il programma e una variante di cliu1.c Il programma da utilizzarsi in combinazione con servu11.c, genera un socket, nel dominio di Unix, di nome endpoint2, attraverso il quale questo programma si mette in comunicazione con il socket, nel dominio di Unix, di nome endpoint1, generato dal programma servu11.c, per inviargli un messaggio dal programma cliu11.c e poi per ricevere un messaggio di risposta. Tale esempio mostra la bidirezionalita del socket endpoint2. #include <sys/un.h> /* UNIX domain #define BUFLEN 1024 char *msg = Richiesta di servizio dal cli_sock ; int s; int addrlen = sizeofstruct sockaddr_un); struct sockaddr_un cli_sock; struct sockaddr_un aiuto; /* struct di appoggio che consente di fare la sendto char buf[buflen]; int cc; /* genera il socket nel dominio UNIX: s = socketaf_unix, SOCK_DGRAM, 0); if s== -1) perror Client: socket\n ); else printf generazione del socket %d: ok\n, s); /* fai la bind: cli_sock.sun_family = AF_UNIX; strcpycli_sock.sun_path, ëndpoint2 ); if binds, &cli_sock, sizeofstruct sockaddr_un)) == -1) perror Client:bind\n ); /* trasmetti un messaggio attraverso il socket s verso aiuto: aiuto.sun_family = AF_UNIX; strcpyaiuto.sun_path, endpoint1 ); if sendtos, msg, strlenmsg) +1, 0, &aiuto, strlenaiuto.sun_path)+2) == -1) perror Client: error send\n ); printf ATTESA DATI DAL SERVER \n ); /* leggi dal socket s: if cc= reads, buf, BUFLEN)) == -1) perror Client: read\n ); printf Client: ricevuto -> %s\n, buf); unlink endpoint2 );
/* servu11.c /* Il programma e una variante di servu1.c Il programma da utilizzarsi in combinazione con cliu11.c, genera un socket, nel sominio Unix, di nome endpoint1, attraverso il quale questo programma si mette in comunicazione con il socket, nel dominio di Unix, di nome endpoint2, generato dal programma cliu1.c, per ricevere un messaggio dal programma cliu1.c e poi per inviargli un messaggio di risposta. Tale esempio mostra la bidirezionalita del socket endpoint1. #include <sys/un.h> /* UNIX domain #define BUFLEN 1024 char *msg = Messaggio dal server ; int s; int addrlen = sizeofstruct sockaddr_un); struct sockaddr_un appoggio; /* struct di appoggio che consente di effettuare la recvfrom struct sockaddr_un serv_sock; char buf[buflem]; /* genera il socket nel dominio Unix: s= socketaf_unix, SOCK_DGRAM, 0); if s== -1) perror Server: socket\n ); else printf generazione del socket %d: ok\n, s); /* fai la bind: serv_sock.sun_family = AF_UNIX; strcpyserv_sock.sun_path, endpoint1 ); if binds, &serv_sock, sizeofstruct sockaddr_un)) == -1) perror Server: bind\n ); if recvfroms, buf, BUFLEN, 0, &appoggio, &addrlen) == -1 ) perror Server: recvfrom\n ); printf MESSAGGIO DAL CLIENT: %s \n, buf); if sendtos, msg, strlenmsg) -1, 0, &appoggio, addrlen) == -1) perror Server: send\n ); unlink endpoint1 );
/* cli1.c /* sintassi: clisun <hostname> < port number socket destinatario> #include <netinet/in.h> #include <netdb.h> #define DATA Tanto va la gatta a lardo, che ci rimette lo zampino mainargc, argv) int argc; char *argv[]; int so; struct sockaddr_in aiuto; struct hostent *hp, *gethostbyname); so= socketaf_inet, SOCK_DGRAM, 0); if so <0) perror errore nella creazione del socket\n ); hp= gethostbynameargv[1]); if hp == 0) fprintfstderr,, %s: host0 sconosciuto\n, argv[1]); bcopychar *) hp->h_addr, char*) &aiuto.sin_addr, hp->h_length); aiuto.sin_family= AF_INET; aiuto.sin_port= htonsatoiargv[2])); if sendtoso, DATA, sizeofdata), 0, struct sock_addr *) &aiuto, sizeofaiuto)) <0) perror errore nell invio del messaggio datagram\n ); closeso);
/* serv1.c /* Da usarsi in congiunzione con cli1.c #include <netinet/in.h> int sock, lun; struct sockaddr_in nome; char buf[1024]; struct sockaddr_in *from; int fromlen; fromlen= sizeofstruct sockaddr_in); sock= socketaf_inet, SOCK_DGRAM, 0); /* fai la bind con una wildcard: nome.sin_family= AF_INET; nome.sin_addr.s_addr= INADDR_ANY; nome.sin_port = 0; if bindsock, struct sockaddr *) &nome, sizeofnome) ) <0) perror errore nella binding\n ); lun= sizeofnome); if getsocknamesock, struct sockaddr *) &nome, &lun) < 0) perror errore nel trovare la porta associata al socket nome\n ); printf porta del socket #%d\n, ntohsnome.sin_port)); /* if readsock, buf, 1024) < 0) perror errore nella ricezione del pacchetto di datagram\n ); if recvfromsock, buf, sizeofbuf), 0, struct sockaddr *) from, &fromlen) < 0) perror errore nella ricezione del pacchetto di datagram\n ); printf ------------%s\n, buf); closesock); exit0);