|
|
|
 |
|  |
 |
futurbaggio |
[LAB] - Programmazione di rete in C |
21-01-2005 15:18 |
|
 |
futurbaggio |
U Frikkettone

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
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
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 |
|
|
|  |
 |
yeah |
Ottimo :)
... |
21-01-2005 20:33 |
|
 |
yeah |
.grande:maestro.

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
Edit | Report | IP: Logged |
Ottimo 
Ora salvo e vedo cosa si può fare 
__________________
?
|
21-01-2005 20:33 |
|
|
|  |
 |
GinoPilotino |
bravissimissimo :D ... |
21-01-2005 22:53 |
|
 |
GinoPilotino |
.grande:maestro.

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
Edit | Report | IP: Logged |
bravissimissimo 
|
21-01-2005 22:53 |
|
|
|  |
 |
yeah |
[i]Client.c[/i]
... |
22-01-2005 01:01 |
|
 |
yeah |
.grande:maestro.

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
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 variabilecode: 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 |
|
|
|  |
 |
Flavia |
Mi sento troppo ignorante!
... |
22-01-2005 11:40 |
|
 |
Flavia |
Regina degli avatar

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
Edit | Report | IP: Logged |
Mi sento troppo ignorante!
Non è che potete svolgere qualche tema d'esame e poi postarlo???

__________________
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.

|
22-01-2005 11:40 |
|
|
|  |
 |
m@cCo |
A cosa serve la dll?
... |
22-01-2005 13:12 |
|
 |
m@cCo |
Steek Huzzee

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
Edit | Report | IP: Logged |
A cosa serve la dll?
Ciao
|
22-01-2005 13:12 |
|
|
|  |
 |
GinoPilotino |
credo che il messaggio di yeah si riferisca alle w ... |
22-01-2005 16:49 |
|
 |
GinoPilotino |
.grande:maestro.

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
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 |
|
|
|  |
 |
m@cCo |
Ah boh io sto usando cygwin.
... |
22-01-2005 18:57 |
|
 |
m@cCo |
Steek Huzzee

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
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 |
|
|
|  |
 |
futurbaggio |
[QUOTE][i]Originally posted by m@cCo [/i]
... |
22-01-2005 19:22 |
|
 |
futurbaggio |
U Frikkettone

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
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 |
|
|
|  |
 |
yeah |
Il commento riguardante la dll arriva direttamente ... |
22-01-2005 20:15 |
|
 |
yeah |
.grande:maestro.

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
Edit | Report | IP: Logged |
Il commento riguardante la dll arriva direttamente dall'help di Microsoft 
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 |
|
|
|  |
 |
m@cCo |
[QUOTE][i]Originally posted by futurbaggio [/i]
... |
23-01-2005 15:54 |
|
 |
m@cCo |
Steek Huzzee

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
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 |
|
|
|  |
 |
futurbaggio |
[QUOTE][i]Originally posted by m@cCo [/i]
... |
23-01-2005 16:24 |
|
 |
futurbaggio |
U Frikkettone

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
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 |
|
|
|  |
 |
m@cCo |
Allora sarà colpa di windows come al solito, vabà ... |
23-01-2005 16:52 |
|
 |
m@cCo |
Steek Huzzee

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
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 |
|
|
|  |
 |
futurbaggio |
[QUOTE][i]Originally posted by m@cCo [/i]
... |
23-01-2005 16:58 |
|
 |
futurbaggio |
U Frikkettone

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
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 |
|
|
|  |
 |
m@cCo |
No io sto usando un emulatore di ambiente unix sot ... |
23-01-2005 17:23 |
|
 |
m@cCo |
Steek Huzzee

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
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 |
|
|
|  |
 |
All times are GMT. The time now is 18:59. |
|
|
 |
|
 |
|
|
|  |
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
|
|
|
|
|
|