Dsy Network www | forum | my | didattica | howto | wiki | el goog | stats | blog | dona | rappresentanti
Homepage
 Register   Calendar   Members  Faq   Search  Logout 
.dsy:it. : Powered by vBulletin version 2.3.1 .dsy:it. > Didattica > Corsi N - Z > Reti di calcolatori > [LAB] Programmazione di rete in C
Pages (2): [1] 2 »   Last Thread   Next Thread
Author
Thread    Expand all | Contract all    Post New Thread    Post A Reply
Collapse
futurbaggio
U Frikkettone

User info:
Registered: Feb 2003
Posts: 774 (0.10 al dì)
Location: Foggia
Corso: TIC
Anno: 1° Magistrale
Time Online: 13 Days, 16:44:00: [...]
Status: Offline

Post actions:

Edit | Report | IP: Logged
[LAB] - Programmazione di rete in C

Originally posted by yeah
qualcuno può postare delcodice che funziona in linux, che faccio una prova? Grazie :cool:


Client.c
code:
#include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <netdb.h> main(){ int sd, server_sd; struct sockaddr_in client; struct hostent *hp; int address_size; int port = 3000; char buff_in[8000]; char buff_out[8000]; hp = gethostbyname("127.0.0.1"); // Creazione di una nuova socket TCP sd = socket(AF_INET,SOCK_STREAM,0); // Definizione delle caratteristiche della socket bzero(&client, sizeof(client)); client.sin_family = PF_INET; client.sin_port = htons(port); client.sin_addr.s_addr = ((struct in_addr*)(hp->h_addr))->s_addr; server_sd = connect(sd, (struct sockaddr*)&client, sizeof(client)); // Prende da tastiera il messaggio da inviare al server printf("Io: "); scanf("%s", buff_in); send (sd, buff_in, strlen(buff_in), 0); // Stampa a video i dati ricevuti dal server recv(sd, buff_out, sizeof(buff_out), 0); printf("Lui: %s \n", buff_out); // Chiusura socket close(sd); return EXIT_SUCCESS; }



Server.c
code:
#include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <netdb.h> main(){ int sd, bind_sd, client_sd; struct sockaddr_in client; struct sockaddr_in server; int address_size; int port = 3000; char buff_in[8000]; char buff_out[8000]; // Creazione di una nuova socket TCP sd = socket(AF_INET,SOCK_STREAM,0); // Definizione delle caratteristiche della Server socket server.sin_family = PF_INET; server.sin_port = htons(port); server.sin_addr.s_addr = INADDR_ANY; // Associazione della socket ad un processo bind_sd = bind(sd,(struct sockaddr *)&server, sizeof(server)); while(1){ // Attivazione della socket listen(sd,20); // Server socket in attesa di richieste del client client_sd = accept(sd, (struct sockaddr *)&client, &address_size); // Stampa a video i dati ricevuti dal client recv(client_sd, buff_in, sizeof(buff_in), 0); printf("Lui: %s \n", buff_in); // Prende da tastiera il messaggio da inviare all'altro interlocutore printf("Io: "); scanf("%s", buff_out); send (client_sd, buff_out, strlen(buff_out), 0); // Chiusura socket close(client_sd); } return EXIT_SUCCESS; }


Roberto

__________________
E lo sceriffo americano non lo sa / ma quando parla ride tutta la città / vile fellone vieni a singolar tenzone / unza unza umpappà troppe truppe mariscià.
Non ci voleva l'eruzione della lava / e due piccioni si contendono la fava / sposa bagnata, bambina svergognata / la questione è delicata / come bolle la patata.
Basta! E' finita la festa
[L'ovile delle vanità, Folkabbestia]

21-01-2005 15:18
Click Here to See the Profile for futurbaggio Click Here to See the Blog of futurbaggio Click here to Send futurbaggio a Private Message Visit futurbaggio's homepage! Find more posts by futurbaggio Add futurbaggio to your buddy list Printer Friendly version Email this Article to a friend Reply w/Quote
Collapse
yeah
.grande:maestro.

User info:
Registered: Nov 2003
Posts: 1644 (0.21 al dì)
Location: Cologno Monzese
Corso: Informatica Magistrale
Anno: II
Time Online: 12 Days, 21:36:41 [...]
Status: Offline

Post actions:

Edit | Report | IP: Logged

Ottimo :)
Ora salvo e vedo cosa si può fare :cool:

__________________
?

21-01-2005 20:33
Click Here to See the Profile for yeah Click here to Send yeah a Private Message Find more posts by yeah Add yeah to your buddy list Printer Friendly version Email this Article to a friend Reply w/Quote
Collapse
GinoPilotino
.grande:maestro.

User info:
Registered: Dec 2002
Posts: 1403 (0.17 al dì)
Location: Segrate
Corso: TI.COM
Anno: Secondo
Time Online: 13 Days, 8:59:42 [...]
Status: Offline

Post actions:

Edit | Report | IP: Logged

bravissimissimo :D

21-01-2005 22:53
Click Here to See the Profile for GinoPilotino Click Here to See the Blog of GinoPilotino Click here to Send GinoPilotino a Private Message Find more posts by GinoPilotino Add GinoPilotino to your buddy list Printer Friendly version Email this Article to a friend Reply w/Quote
Collapse
yeah
.grande:maestro.

User info:
Registered: Nov 2003
Posts: 1644 (0.21 al dì)
Location: Cologno Monzese
Corso: Informatica Magistrale
Anno: II
Time Online: 12 Days, 21:36:41 [...]
Status: Offline

Post actions:

Edit | Report | IP: Logged

Client.c

code:
#include <stdio.h> #include <stdlib.h> /* #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <netdb.h> */ #include <winsock2.h> int main() { /* Variabile per l'uso delle socket di Windows */ WSADATA wsaData; int sd, server_sd; struct sockaddr_in client; struct hostent *hp; int address_size; int port = 3000; char buff_in[8000]; char buff_out[8000]; /* Inizializzazione l'uso di ws2_32.dll da parte del processo */ WSAStartup(MAKEWORD( 2, 2 ), &wsaData); hp = gethostbyname("127.0.0.1"); // Creazione di una nuova socket TCP sd = socket(AF_INET,SOCK_STREAM,0); // Definizione delle caratteristiche della socket /* bzero(&client, sizeof(client)); */ memset(&client, 0, sizeof(client)); client.sin_family = PF_INET; client.sin_port = htons(port); client.sin_addr.s_addr = ((struct in_addr*)(hp->h_addr))->s_addr; server_sd = connect(sd, (struct sockaddr*)&client, sizeof(client)); // Prende da tastiera il messaggio da inviare al server printf("Io: "); scanf("%s", buff_in); send (sd, buff_in, strlen(buff_in), 0); // Stampa a video i dati ricevuti dal server recv(sd, buff_out, sizeof(buff_out), 0); printf("Lui: %s \n", buff_out); // Chiusura socket closesocket(sd); /*close(sd);*/ /* Termina l'uso di ws2_32.dll */ WSACleanup(); return EXIT_SUCCESS; }


Server.c
code:
#include <stdio.h> #include <stdlib.h> /* #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <netdb.h> */ #include <winsock2.h> int main() { /* Variabile per l'uso delle socket di Windows */ WSADATA wsaData; int sd, bind_sd, client_sd; struct sockaddr_in client; struct sockaddr_in server; int address_size; int port = 3000; char buff_in[8000]; char buff_out[8000]; /* Inizializzazione l'uso di ws2_32.dll da parte del processo */ WSAStartup(MAKEWORD( 2, 2 ), &wsaData); // Creazione di una nuova socket TCP sd = socket(AF_INET,SOCK_STREAM,0); // Definizione delle caratteristiche della Server socket server.sin_family = PF_INET; server.sin_port = htons(port); server.sin_addr.s_addr = INADDR_ANY; // Associazione della socket ad un processo bind_sd = bind(sd,(struct sockaddr *)&server, sizeof(server)); while(1) { // Attivazione della socket listen(sd,20); // Server socket in attesa di richieste del client client_sd = accept(sd, (struct sockaddr *)&client, &address_size); // Stampa a video i dati ricevuti dal client recv(client_sd, buff_in, sizeof(buff_in), 0); printf("Lui: %s \n", buff_in); // Prende da tastiera il messaggio da inviare all'altro interlocutore printf("Io: "); scanf("%s", buff_out); send(client_sd, buff_out, strlen(buff_out), 0); // Chiusura socket closesocket(client_sd); /* close(client_sd); */ } /* Termina l'uso di ws2_32.dll */ WSACleanup(); return EXIT_SUCCESS; }


I miei commenti sono tra /* e */, gli altri sono di futurbaggio.

In pratica ho sostituito i file header con
code:
#include <winsock2.h>

Ho aggiunto la variabile
code:
WSAData wsadata
che server per l'inizializzazione della dll, ho chiamato WSAStartup() prima di ogni funzione di rete e WSACleanup() alla fine delle funzioni di rete.

Poi ho sostituito
code:
bzero(&client, sizeof(client)); close(sd);

con
code:
memset(&client, 0, sizeof(client)); closesocket(sd);


Avrei dovuto dichiarare le variabili quali server_sd come di tipo SOCKET, ma alla fine si tratta sempre di numeri interi (con la differenza che i secondi sono senza segno).

[edit]

Per compilare dovete aggiungere la libreria ws2_32 (es con GCC -lws2_32)

__________________
?

22-01-2005 01:01
Click Here to See the Profile for yeah Click here to Send yeah a Private Message Find more posts by yeah Add yeah to your buddy list Printer Friendly version Email this Article to a friend Reply w/Quote
Collapse
Flavia
Regina degli avatar

User info:
Registered: Sep 2002
Posts: 3228 (0.39 al dì)
Location: Bergamo
Corso: TI.COM
Anno: Finito! :D
Time Online: 25 Days, 9:12:10 [...]
Status: Offline

Post actions:

Edit | Report | IP: Logged

Mi sento troppo ignorante!

Non è che potete svolgere qualche tema d'esame e poi postarlo??? :please:
:lode:

__________________
I ragazzi che si amano si baciano in piedi contro le porte della notte, e la gente che passa li punta con il dito, ma i ragazzi che si amano non ci sono per nessuno ed è la loro ombra soltanto che trema nella notte.
Stimolando la rabbia dei passanti, la loro rabbia il loro disprezzo le risa la loro invidia.
I ragazzi che si amano non ci sono per nessuno.
Essi sono altrove, molto più lontano della notte, molto più in alto del giorno, nell'abbagliante splendore del loro amore.

:date:

22-01-2005 11:40
Click Here to See the Profile for Flavia Click Here to See the Blog of Flavia Click here to Send Flavia a Private Message Find more posts by Flavia Add Flavia to your buddy list Printer Friendly version Email this Article to a friend Reply w/Quote
Collapse
m@cCo
Steek Huzzee

User info:
Registered: Sep 2003
Posts: 936 (0.12 al dì)
Location: Trecate - Novara - Piedmont - Italy
Corso: Computer Science (magistrale)
Anno: II
Time Online: 9 Days, 0:20:33 [...]
Status: Offline

Post actions:

Edit | Report | IP: Logged

A cosa serve la dll?

Ciao

22-01-2005 13:12
Click Here to See the Profile for m@cCo Click here to Send m@cCo a Private Message Find more posts by m@cCo Add m@cCo to your buddy list Printer Friendly version Email this Article to a friend Reply w/Quote
Collapse
GinoPilotino
.grande:maestro.

User info:
Registered: Dec 2002
Posts: 1403 (0.17 al dì)
Location: Segrate
Corso: TI.COM
Anno: Secondo
Time Online: 13 Days, 8:59:42 [...]
Status: Offline

Post actions:

Edit | Report | IP: Logged

credo che il messaggio di yeah si riferisca alle winsocket, ossia alle socket in c sotto windows.
ovviamente non ne sono sicuro al 100% perchè il c non l'ho mai visto.

22-01-2005 16:49
Click Here to See the Profile for GinoPilotino Click Here to See the Blog of GinoPilotino Click here to Send GinoPilotino a Private Message Find more posts by GinoPilotino Add GinoPilotino to your buddy list Printer Friendly version Email this Article to a friend Reply w/Quote
Collapse
m@cCo
Steek Huzzee

User info:
Registered: Sep 2003
Posts: 936 (0.12 al dì)
Location: Trecate - Novara - Piedmont - Italy
Corso: Computer Science (magistrale)
Anno: II
Time Online: 9 Days, 0:20:33 [...]
Status: Offline

Post actions:

Edit | Report | IP: Logged

Ah boh io sto usando cygwin.
Non ho capito questa linea di codice:

code:
client.sin_addr.s_addr = ((struct in_addr*)(hp->h_addr))->s_addr;

perchè non usare inet_address() o inet_aton()?

Le frecce servono ad accedere ai campi di una classe no?
Qualcuno sarebbe così gentile da spiegarmi cosa fa quella riga di codice?

Ciao

22-01-2005 18:57
Click Here to See the Profile for m@cCo Click here to Send m@cCo a Private Message Find more posts by m@cCo Add m@cCo to your buddy list Printer Friendly version Email this Article to a friend Reply w/Quote
Collapse
futurbaggio
U Frikkettone

User info:
Registered: Feb 2003
Posts: 774 (0.10 al dì)
Location: Foggia
Corso: TIC
Anno: 1° Magistrale
Time Online: 13 Days, 16:44:00: [...]
Status: Offline

Post actions:

Edit | Report | IP: Logged

Originally posted by m@cCo
Le frecce servono ad accedere ai campi di una classe no?
Qualcuno sarebbe così gentile da spiegarmi cosa fa quella riga di codice?


In C non esiste il concetto di classe ma qualcosa che gli assomiglia, le strutture, che sono un tipo di dato complesso composto da + tipi primitivi (int, double, char, etc) e/o da altre strutture.
In particolare noi utilizziamo la struttura socketaddr_in che è composta da vari attributi semplici (sinf_family o sin_port) e da una sotto-struttura (sin_addr), questa a sua volta contiene l'attributo s_addr.
Nella riga che hai indicato in pratica si copia in questo attributo il valore dell'attributo s_addr di un'altra struttura analoga che è stata creata poco sopra:

hp = gethostbyname("127.0.0.1");

C'è una differenza sostanziale però tra la struttura 'client' (ai cui attributi accediamo attraverso l'operatore '.') e la struttura 'hp', infatti 'hp' è definito come un puntatore per questo utilizziamo l'opertore '->' per scorrere gli attributi.
Questa parte del codice (struct in_addr*) non è altro che un'operazione di cast, spero di essermi spiegato, mi rendo conto che non è una cosa semplicissima anche perchè i puntatori non esistono in Java.

Roberto

__________________
E lo sceriffo americano non lo sa / ma quando parla ride tutta la città / vile fellone vieni a singolar tenzone / unza unza umpappà troppe truppe mariscià.
Non ci voleva l'eruzione della lava / e due piccioni si contendono la fava / sposa bagnata, bambina svergognata / la questione è delicata / come bolle la patata.
Basta! E' finita la festa
[L'ovile delle vanità, Folkabbestia]

22-01-2005 19:22
Click Here to See the Profile for futurbaggio Click Here to See the Blog of futurbaggio Click here to Send futurbaggio a Private Message Visit futurbaggio's homepage! Find more posts by futurbaggio Add futurbaggio to your buddy list Printer Friendly version Email this Article to a friend Reply w/Quote
Collapse
yeah
.grande:maestro.

User info:
Registered: Nov 2003
Posts: 1644 (0.21 al dì)
Location: Cologno Monzese
Corso: Informatica Magistrale
Anno: II
Time Online: 12 Days, 21:36:41 [...]
Status: Offline

Post actions:

Edit | Report | IP: Logged

Il commento riguardante la dll arriva direttamente dall'help di Microsoft :D

Sì, il mio codice lavora con le socket di Windows.

In Windows le funzioni di sistema sono tutte organizzate in dll, librerie che possono essere caricate da vari programmi.

In sostanza, ci sono un tot di funzioni comuni a più programmi. Invece di 'inserire' il codice di quelle funzioni in ogni programma, quel codice è raccolto un una dll, che i programmi possono caricare, risparmiando spazio.

La stessa funzionalità (credo con un principio simile) esiste anche in Unix/Linux.

__________________
?

22-01-2005 20:15
Click Here to See the Profile for yeah Click here to Send yeah a Private Message Find more posts by yeah Add yeah to your buddy list Printer Friendly version Email this Article to a friend Reply w/Quote
Collapse
m@cCo
Steek Huzzee

User info:
Registered: Sep 2003
Posts: 936 (0.12 al dì)
Location: Trecate - Novara - Piedmont - Italy
Corso: Computer Science (magistrale)
Anno: II
Time Online: 9 Days, 0:20:33 [...]
Status: Offline

Post actions:

Edit | Report | IP: Logged

Originally posted by futurbaggio
In C non esiste il concetto di classe ma qualcosa che gli assomiglia, le strutture, che sono un tipo di dato complesso composto da + tipi primitivi (int, double, char, etc) e/o da altre strutture.
In particolare noi utilizziamo la struttura socketaddr_in che è composta da vari attributi semplici (sinf_family o sin_port) e da una sotto-struttura (sin_addr), questa a sua volta contiene l'attributo s_addr.
Nella riga che hai indicato in pratica si copia in questo attributo il valore dell'attributo s_addr di un'altra struttura analoga che è stata creata poco sopra:

hp = gethostbyname("127.0.0.1");

C'è una differenza sostanziale però tra la struttura 'client' (ai cui attributi accediamo attraverso l'operatore '.') e la struttura 'hp', infatti 'hp' è definito come un puntatore per questo utilizziamo l'opertore '->' per scorrere gli attributi.
Questa parte del codice (struct in_addr*) non è altro che un'operazione di cast, spero di essermi spiegato, mi rendo conto che non è una cosa semplicissima anche perchè i puntatori non esistono in Java.

Roberto


Si conosco i puntatori in c, semplicemente non capisco perchè tu abbia utilizzato la funzione gethostbyname() invece di utilizzare le più semplici inet_address() o inet_aton() che traducono l'indirizzo espresso in notazione decimale in un long a 32 bit.

Altra cosa:

ho provato a far girare i tuoi client e server ma non funzionano, o meglio, il server non visualizza ciò che scrivo sul client passando subito al proprio input, mentre il client non visualizza l'input del server.

Ciao

23-01-2005 15:54
Click Here to See the Profile for m@cCo Click here to Send m@cCo a Private Message Find more posts by m@cCo Add m@cCo to your buddy list Printer Friendly version Email this Article to a friend Reply w/Quote
Collapse
futurbaggio
U Frikkettone

User info:
Registered: Feb 2003
Posts: 774 (0.10 al dì)
Location: Foggia
Corso: TIC
Anno: 1° Magistrale
Time Online: 13 Days, 16:44:00: [...]
Status: Offline

Post actions:

Edit | Report | IP: Logged

Originally posted by m@cCo
Si conosco i puntatori in c, semplicemente non capisco perchè tu abbia utilizzato la funzione gethostbyname() invece di utilizzare le più semplici inet_address() o inet_aton() che traducono l'indirizzo espresso in notazione decimale in un long a 32 bit.


Credo che ognuno sia libero di usare quello che più crede facile e semplice, io mi sono rifatto agli esempi di cassiano e mi sono studiato quelle primitive.

Originally posted by m@cCo
Altra cosa:
ho provato a far girare i tuoi client e server ma non funzionano, o meglio, il server non visualizza ciò che scrivo sul client passando subito al proprio input, mentre il client non visualizza l'input del server.


Con gcc 3.3.4 su Debian stable funziona...

Roberto

__________________
E lo sceriffo americano non lo sa / ma quando parla ride tutta la città / vile fellone vieni a singolar tenzone / unza unza umpappà troppe truppe mariscià.
Non ci voleva l'eruzione della lava / e due piccioni si contendono la fava / sposa bagnata, bambina svergognata / la questione è delicata / come bolle la patata.
Basta! E' finita la festa
[L'ovile delle vanità, Folkabbestia]

23-01-2005 16:24
Click Here to See the Profile for futurbaggio Click Here to See the Blog of futurbaggio Click here to Send futurbaggio a Private Message Visit futurbaggio's homepage! Find more posts by futurbaggio Add futurbaggio to your buddy list Printer Friendly version Email this Article to a friend Reply w/Quote
Collapse
m@cCo
Steek Huzzee

User info:
Registered: Sep 2003
Posts: 936 (0.12 al dì)
Location: Trecate - Novara - Piedmont - Italy
Corso: Computer Science (magistrale)
Anno: II
Time Online: 9 Days, 0:20:33 [...]
Status: Offline

Post actions:

Edit | Report | IP: Logged

Allora sarà colpa di windows come al solito, vabè...grazie della spiegazione.
Credete che il prof terrà conto dell'utilizzo o meno delle primitive usate negli esempi?
O come dice futurbaggio ognuno è libero di usare ciò che vuole, perchè non mi pare che su java le cose stiano proprio così...

Ciao

23-01-2005 16:52
Click Here to See the Profile for m@cCo Click here to Send m@cCo a Private Message Find more posts by m@cCo Add m@cCo to your buddy list Printer Friendly version Email this Article to a friend Reply w/Quote
Collapse
futurbaggio
U Frikkettone

User info:
Registered: Feb 2003
Posts: 774 (0.10 al dì)
Location: Foggia
Corso: TIC
Anno: 1° Magistrale
Time Online: 13 Days, 16:44:00: [...]
Status: Offline

Post actions:

Edit | Report | IP: Logged

Originally posted by m@cCo
Allora sarà colpa di windows come al solito, vabè...grazie della spiegazione.


Forse per Windows dovresti usare il codice di yeah, io non ti posso aiutare perchè non ho windows...

Roberto

__________________
E lo sceriffo americano non lo sa / ma quando parla ride tutta la città / vile fellone vieni a singolar tenzone / unza unza umpappà troppe truppe mariscià.
Non ci voleva l'eruzione della lava / e due piccioni si contendono la fava / sposa bagnata, bambina svergognata / la questione è delicata / come bolle la patata.
Basta! E' finita la festa
[L'ovile delle vanità, Folkabbestia]

23-01-2005 16:58
Click Here to See the Profile for futurbaggio Click Here to See the Blog of futurbaggio Click here to Send futurbaggio a Private Message Visit futurbaggio's homepage! Find more posts by futurbaggio Add futurbaggio to your buddy list Printer Friendly version Email this Article to a friend Reply w/Quote
Collapse
m@cCo
Steek Huzzee

User info:
Registered: Sep 2003
Posts: 936 (0.12 al dì)
Location: Trecate - Novara - Piedmont - Italy
Corso: Computer Science (magistrale)
Anno: II
Time Online: 9 Days, 0:20:33 [...]
Status: Offline

Post actions:

Edit | Report | IP: Logged

No io sto usando un emulatore di ambiente unix sotto windows (cygwin), però se tu mi dici che sotto linux il codice da te postato funziona correttamente l'unica cosa che mi viene in mente è che a dare problemi sia la gestione della rete di windows, quando ho tempo proverò con linux.

Ciao

23-01-2005 17:23
Click Here to See the Profile for m@cCo Click here to Send m@cCo a Private Message Find more posts by m@cCo Add m@cCo to your buddy list Printer Friendly version Email this Article to a friend Reply w/Quote
All times are GMT. The time now is 18:59.    Post New Thread    Post A Reply
Pages (2): [1] 2 »   Last Thread   Next Thread
Show Printable Version | Email this Page | Subscribe to this Thread | Add to Bookmarks

Forum Jump:
Rate This Thread:

Forum Rules:
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts
HTML code is OFF
vB code is ON
Smilies are ON
[IMG] code is ON
 

Powered by: vBulletin v2.3.1 - Copyright ©2000 - 2002, Jelsoft Enterprises Limited
Mantained by dsy crew (email) | Collabora con noi | Segnalaci un bug | Archive | Regolamento | Licenze | Thanks | Syndacate
Pagina generata in 0.087 seconds (59.93% PHP - 40.07% MySQL) con 31 query.