|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Junior Member
Iscritto dal: Mar 2005
Messaggi: 16
|
Uffa ..i socket..
Ciao
qualcuno potrebbe dirmi perche' questo stupido programma non va? in teoria Il client si connette al server che risponde con uno stupido messaggio. La connessione sembra avvenire,ma il client non stampa quello che dovrebbe --------------------------------------------------- server.c #include <signal.h> #include <stdio.h> #include <stdlib.h> #include <errno.h> #include <winsock.h> #define PORT 12345 #define BL 1024 main() { int sock, client_len, fd; char buffer[BL]; struct sockaddr_in server, client; #ifdef WIN32 WSADATA wsaData; WSAStartup (0x0101,&wsaData); #endif sock = socket(AF_INET, SOCK_STREAM, 0); if (sock <0) { perror("creazione del socket fallita"); exit(1); } server.sin_family = AF_INET; server.sin_addr.s_addr = htonl(INADDR_ANY); /* accetta da qualunque sua interfaccia */ server.sin_port = htons(PORT); if(bind(sock, (struct sockaddr *)&server, sizeof(server)) <0) { perror("bind socket fallita"); exit(2); } listen(sock, 15); while(1) { client_len = sizeof(client); if( (fd=accept(sock, (struct sockaddr *)&client, &client_len))<0) { perror("accept fallita"); exit(3); } printf("Comunicazione in arrivo\n"); sprintf(buffer, "Ciao sono il Server di prova\n\0\0"); write(fd, buffer, strlen(buffer)+1); close(fd); } } --------------------------------------------------------------------------- Client.c #include <winsock.h> #include <signal.h> #include <stdio.h> #include <stdlib.h> #include <errno.h> #define PORT 12345 #define BL 1024 main(argc, argv) int argc; char *argv[]; { int sock, server_len, count; char buffer[BL]; struct hostent *host; struct sockaddr_in server, client; #ifdef WIN32 WSADATA wsaData; WSAStartup (0x0101,&wsaData); #endif sock = socket(AF_INET, SOCK_STREAM, 0); if (sock <0) { perror("creazione del socket fallita"); exit(1); } host = gethostbyname(argv[1]); if(host == NULL) { perror("host inesistente"); exit(2); } server_len = sizeof server; server.sin_family = AF_INET; server.sin_port = htons(PORT); server.sin_addr.s_addr=htonl(INADDR_ANY); memcpy(&server.sin_addr.s_addr, host->h_addr, host->h_length); if(connect(sock, (struct sockaddr *)&server, sizeof(server))<0){ perror("Errore connect"); exit(3); } printf("Connessione Fatta\n"); while((count=read(sock, buffer, BL))>0) { printf("%d %s\n", count, buffer); } close(sock); } ------------------------------------- grazie ciao Uffanoia |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Jun 2002
Città:
Provincia De VaRéSe ~ § ~ Lat.: 45° 51' 7" N Long.: 8° 50' 21" E ~§~ Magica Inter ~ § ~ Detto: A Chi Più Amiamo Meno Dire Sappiamo ~ § ~ ~ § ~ Hobby: Divertimento allo Stato Puro ~ § ~ ~ § ~ You Must Go Out ~ § ~
Messaggi: 8895
|
server
Codice:
#include <signal.h> #include <stdio.h> #include <stdlib.h> #include <errno.h> #include <winsock.h> #define PORT 12345 #define BL 1024 #define localhost "127.0.0.1" int main() { int sock, client_len, fd; char buffer[BL]; struct sockaddr_in sad, cad; #ifdef WIN32 WSADATA wsaData; WSAStartup (0x0101,&wsaData); #endif memset ((char*)&sad,0,sizeof(sad)); sad.sin_family = AF_INET; sad.sin_addr.s_addr = inet_addr(localhost); sad.sin_port = htons ((u_short)PORT); sock = socket(PF_INET, SOCK_STREAM, 0); if (sock <0) { perror("creazione del socket fallita"); exit(1); } if(bind(sock, (struct sockaddr *)&sad, sizeof(sad)) <0) { perror("bind socket fallita"); exit(2); } listen(sock, 15); while(1) { printf ("\nIn attesa di client\n"); client_len = sizeof(cad); if( (fd=accept(sock, (struct sockaddr *)&cad, &client_len))<0) { perror("accept fallita"); exit(3); } printf("Comunicazione in arrivo\n"); char string[] = "Ciao sono il server di prova.\n"; send (fd, string, sizeof (string), 0); closesocket (fd); } closesocket(sock); } Codice:
#include <winsock.h> #include <signal.h> #include <stdio.h> #include <stdlib.h> #include <errno.h> #define PORT 12345 #define BL 1024 #define localhost "127.0.0.1" int main(int argc, char* argv[]) { int sock, server_len, count; char buffer[BL]; struct hostent *host; struct sockaddr_in server, client; #ifdef WIN32 WSADATA wsaData; WSAStartup (0x0101,&wsaData); #endif sock = socket(PF_INET, SOCK_STREAM, 0); if (sock <0) { perror("creazione del socket fallita"); exit(1); } host = gethostbyname(argv[1]); if(host == NULL) { perror("host inesistente"); exit(2); } server.sin_family = AF_INET; server.sin_addr.s_addr = inet_addr(localhost); server.sin_port = htons ((u_short)PORT); if(connect(sock, (struct sockaddr *)&server, sizeof(server))<0){ perror("Errore connect"); exit(3); } printf("Connessione Fatta\n"); while((count=recv(sock, buffer, sizeof(buffer),0))>0) { printf("%d %s\n", count, buffer); } closesocket(sock); system ("PAUSE"); return (EXIT_SUCCESS); }
__________________
Meglio essere protagonisti della propria tragedia che spettatori della propria vita
Si dovrebbe pensare più a far bene che a stare bene: e così si finirebbe anche a star meglio. Non preoccuparti solo di essere migliore dei tuoi contemporanei o dei tuoi predecessori.Cerca solo di essere migliore di te stesso |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 414
|
guardando il codice velocemente ho notato che per inviare e ricevere i dati usi read e write, che non è del tutto sbagliato, ma il dubbio mi viene perche quelle funzioni si usano per scrivere i file a basso livello senza buffer(ogni chiamata corrisponde ad un accesso diretto al disco), e quindi non so con certezza se funzioni o meno, io ti consilio di usare le funzioni send e recv che funzionano sicuramente.
send(int socket,voids * buff,int buflen,int fleg)//per inviare normalmente puoi impostare il flag a 0 recv(int socket,voids * buff,int buflen,int fleg)//per ricevere normalmente puoi impostare il flag a 0 |
![]() |
![]() |
![]() |
#4 |
Junior Member
Iscritto dal: Mar 2005
Messaggi: 16
|
Grazie!!
Ora funziona perfettamente ! Ma per cosa sta PF_INET ? -- La funzione che ho usato memcpy(&server.sin_addr.s_addr, host->h_addr, host->h_length); e' Inutile? --- memset ((char*)&sad,0,sizeof(sad)); cancella la "struttura"? perche' bisogna farlo prima se subito dopo la si "riempie"? --- Perchè l'uso di read e write non sono corrette? -- Al posto di send e recv si potrebbero usare sendto() e recvfrom()? --- ciao uffanoia |
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Jun 2002
Città:
Provincia De VaRéSe ~ § ~ Lat.: 45° 51' 7" N Long.: 8° 50' 21" E ~§~ Magica Inter ~ § ~ Detto: A Chi Più Amiamo Meno Dire Sappiamo ~ § ~ ~ § ~ Hobby: Divertimento allo Stato Puro ~ § ~ ~ § ~ You Must Go Out ~ § ~
Messaggi: 8895
|
PF_INET sta per il protocollo va bene anche AF_INET ... ma logicamente sarebbe meglio scrivere il primo nella creazione del socket.
memcpy che hai fatto va bene se vuoi usare gethostbyname te lo ho tolto per velocità mia. cancellare la struttura è per la compatibilità con la struttura sockaddr. si è discusso un paio di giorni fa. sendto e recvfrom dovrebbero forse andare mai provato ~§~ Sempre E Solo Lei ~§~
__________________
Meglio essere protagonisti della propria tragedia che spettatori della propria vita
Si dovrebbe pensare più a far bene che a stare bene: e così si finirebbe anche a star meglio. Non preoccuparti solo di essere migliore dei tuoi contemporanei o dei tuoi predecessori.Cerca solo di essere migliore di te stesso |
![]() |
![]() |
![]() |
#6 |
Junior Member
Iscritto dal: Mar 2005
Messaggi: 16
|
Ok ,tutto chiaro
grazie mille! Buona giornata Ciao uffanoia |
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Jun 2002
Città:
Provincia De VaRéSe ~ § ~ Lat.: 45° 51' 7" N Long.: 8° 50' 21" E ~§~ Magica Inter ~ § ~ Detto: A Chi Più Amiamo Meno Dire Sappiamo ~ § ~ ~ § ~ Hobby: Divertimento allo Stato Puro ~ § ~ ~ § ~ You Must Go Out ~ § ~
Messaggi: 8895
|
de nada
~§~ Sempre E Solo Lei ~§~
__________________
Meglio essere protagonisti della propria tragedia che spettatori della propria vita
Si dovrebbe pensare più a far bene che a stare bene: e così si finirebbe anche a star meglio. Non preoccuparti solo di essere migliore dei tuoi contemporanei o dei tuoi predecessori.Cerca solo di essere migliore di te stesso |
![]() |
![]() |
![]() |
#8 |
Member
Iscritto dal: Mar 2005
Messaggi: 41
|
ciao
secondo me per usare read e write devi condividere il buffer mettendolo in un .h Gia' che ci sono chiedo.. Ma se invece di un messaggio stringa volessi rispondere con un intero come faccio visto che il buffer è dichiarato char * , e lo devo passare a send e recv come char *? La funzione select() a cosa serve? Se voglio mandare messaggi in broadcast,o mandare messaggi a piu client, come devo fare/cosa devo usare? |
![]() |
![]() |
![]() |
#9 |
Senior Member
Iscritto dal: Jun 2002
Città:
Provincia De VaRéSe ~ § ~ Lat.: 45° 51' 7" N Long.: 8° 50' 21" E ~§~ Magica Inter ~ § ~ Detto: A Chi Più Amiamo Meno Dire Sappiamo ~ § ~ ~ § ~ Hobby: Divertimento allo Stato Puro ~ § ~ ~ § ~ You Must Go Out ~ § ~
Messaggi: 8895
|
un modo sarebbe quello di usare una union
~§~ Sempre E Solo Lei ~§~
__________________
Meglio essere protagonisti della propria tragedia che spettatori della propria vita
Si dovrebbe pensare più a far bene che a stare bene: e così si finirebbe anche a star meglio. Non preoccuparti solo di essere migliore dei tuoi contemporanei o dei tuoi predecessori.Cerca solo di essere migliore di te stesso |
![]() |
![]() |
![]() |
#10 |
Junior Member
Iscritto dal: Mar 2005
Messaggi: 16
|
Ciao,
Per gli interi con union funziona sicuramente. per la select www.lilik.it/~mirko/gapil/gapilsu251.html Per il broadcast credo si debba usare UDP,eliminando accept(),connect() e utilizzando solo sendto e recvfrom(). ciao uffanoia |
![]() |
![]() |
![]() |
#11 |
Senior Member
Iscritto dal: Mar 2005
Messaggi: 349
|
scusate io nn ho mai capito a cosa serve il socket?
|
![]() |
![]() |
![]() |
#12 |
Member
Iscritto dal: Mar 2005
Messaggi: 41
|
grazie
e quindi che differenze ci sono con udp(che è poi sto udp?)? non esiste alcun modo(corretto) per usare read e write invece di send e recv? |
![]() |
![]() |
![]() |
#13 |
Junior Member
Iscritto dal: Mar 2005
Messaggi: 16
|
Allora..molto velocemente ..grosso modo..
Un socket è definita come l'stremita' di un canale di comunicazione. Una coppia di processi che comunica attraverso una rete usa una coppia di socket,una per ogni processo,e ogni socket è identificata da un indirizzo IP concatenato a un numero di porta. Le architetture client-server sono implementate ,solitamente,usando le socket. Il server attende le richieste dei client ,stando in ascolto sulle porte;quando riceve una richiesta ,se accetta la connessione proveniente dalla socket del client ,si stabilisce la comunicazione. La differenza è appunto è eliminare accept(),connect() e utilizzare solo sendto() e recvfrom(). Non so se esiste un modo per usare read e write,ma credo di si. comunque funzionano benissimo anche send e recv . Comunque se trovi un modo potresti postarlo.. ciao uffanoia |
![]() |
![]() |
![]() |
#14 |
Member
Iscritto dal: Mar 2005
Messaggi: 41
|
Ma se volessi contattare piu client con i socket normali non
si potrebb e fare un ciclo for nella chiamata socket(); for(i=0;I<n;i++){ sock = socket(PF_INET, SOCK_STREAM, 0); } in questo modo ci sarebbe un socket per ogni client.O no? |
![]() |
![]() |
![]() |
#15 |
Senior Member
Iscritto dal: Jun 2002
Città:
Provincia De VaRéSe ~ § ~ Lat.: 45° 51' 7" N Long.: 8° 50' 21" E ~§~ Magica Inter ~ § ~ Detto: A Chi Più Amiamo Meno Dire Sappiamo ~ § ~ ~ § ~ Hobby: Divertimento allo Stato Puro ~ § ~ ~ § ~ You Must Go Out ~ § ~
Messaggi: 8895
|
dovresti creare dei figli
~§~ Sempre E Solo Lei ~§~
__________________
Meglio essere protagonisti della propria tragedia che spettatori della propria vita
Si dovrebbe pensare più a far bene che a stare bene: e così si finirebbe anche a star meglio. Non preoccuparti solo di essere migliore dei tuoi contemporanei o dei tuoi predecessori.Cerca solo di essere migliore di te stesso |
![]() |
![]() |
![]() |
#16 |
Member
Iscritto dal: Mar 2005
Messaggi: 41
|
utilizzando la fork()?
quindi come verrebbe? while(1){ ... .. pid=fork(); if(pid==0){ fai_quello_che_devi-fare; } else close} invia_risposta();} ??? |
![]() |
![]() |
![]() |
#17 |
Senior Member
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 414
|
Se si leggono le specifiche delle funzioni read è write, queste vanno ad eseguire un accesso diretto al dispositivo senza alcun buffer o cosa del genere, il socket invece possiede un buffer dove vengono scritti e letti i dati, quindi non si possono utilizzare funzioni non bufferizate su buffer e le read e write non funzionano, come invece funzionano le FileRead e FileWrite di windows.
Ciao.. |
![]() |
![]() |
![]() |
#18 |
Member
Iscritto dal: Mar 2005
Messaggi: 41
|
Ma in teoria essendo
int read(int fildes,void* buf,size_t nbyte); Legge n bytes dal file associato a fildes copiandoli nella zona di memoria a partire dall'indirizzo "buf";restituisce il numero di bytes effettivamente letti. int write(int fildes,const void* buf,size_t nbyte); Scrive nbyte nel file associato a "fildes" copiandoli nella zona di memoria a partire dall 'indirizzo "buf";restituisce il numero di bytes scritti. dovrebbero leggere/scrivere i bytes dal/nel contenuto di buf. Quindi se uso una write scrivo nel buffer e per leggerlo uso una read.Non capisco perche' non possa andare bene? ????? |
![]() |
![]() |
![]() |
#19 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Per Windows devi usare send e recv...per Linux puoi usare send e recv o read e write...
|
![]() |
![]() |
![]() |
#20 |
Member
Iscritto dal: Mar 2005
Messaggi: 41
|
ah ho capito
grazie ciao |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 10:53.