![]() |
Pages (2): [1] 2 » Show 150 posts per page |
.dsy:it. (http://www.dsy.it/forum/)
- Reti di calcolatori (http://www.dsy.it/forum/forumdisplay.php?forumid=68)
-- [LAB] Programmazione di rete in C (http://www.dsy.it/forum/showthread.php?threadid=16704)
[LAB] - Programmazione di rete in C
Originally posted by yeah
qualcuno può postare delcodice che funziona in linux, che faccio una prova? Grazie![]()
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; }
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; }
__________________
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]
Ottimo 
Ora salvo e vedo cosa si può fare ![]()
__________________
?
bravissimissimo ![]()
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; }
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; }
code:
#include <winsock2.h>
che server per l'inizializzazione della dll, ho chiamato WSAStartup() prima di ogni funzione di rete e WSACleanup() alla fine delle funzioni di rete.code:
WSAData wsadata
code:
bzero(&client, sizeof(client)); close(sd);
code:
memset(&client, 0, sizeof(client)); closesocket(sd);
__________________
?
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.

A cosa serve la dll?
Ciao
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.
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;
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?
__________________
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]
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.
__________________
?
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
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.
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.
__________________
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]
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
Originally posted by m@cCo
Allora sarà colpa di windows come al solito, vabè...grazie della spiegazione.
__________________
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]
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
| All times are GMT. The time now is 00:18. | Pages (2): [1] 2 » Show all 17 posts from this thread on one page |
Powered by: vBulletin Version 2.3.1
Copyright © Jelsoft Enterprises Limited 2000 - 2002.