|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Nov 2000
Città: Salerno
Messaggi: 4338
|
Problema con i Socket in C
Salve raga
![]() ho realizzato un programma server-client in cui, scrivendo da linea di comando un frase (lato client), il server conta il num di parole (intese con numero di spazi) e restituisce il risultato al client. Il programma funziona solo la "prima" volta: cioè, il primo risultato restituito è esatto, ma la seconda volta sbaglia... E' come se rimanga memorizzata ancora la prima frase, quindi penso debba essere "ripulito" il socket o qualcosa del genere... Il prog è questo Codice:
Server #include "basic.h" void server_echo(int sockfd); int main(int argc, char **argv) { pid_t childpid; int listenfd, connfd; struct sockaddr_in servaddr, cliaddr; socklen_t cliaddr_len; if( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) printf("socket error"); bzero(&servaddr, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = htonl(INADDR_ANY); servaddr.sin_port = htons(PORT); /* daytime server */ if( (bind(listenfd, (struct sockaddr *) &servaddr, sizeof(servaddr))) < 0) printf("bind error"); if( listen(listenfd, BACKLOG) < 0 ) printf("listen error"); for ( ; ; ) { cliaddr_len = sizeof(cliaddr); if( (connfd = accept(listenfd, (struct sockaddr *) &cliaddr, &cliaddr_len)) < 0) printf("accept error"); if( (childpid = fork()) == 0 ) { close(listenfd); server_echo(connfd); /* svolge tutto il lavoro del server */ exit(0); } close(connfd); } } void server_echo(int sockfd) { ssize_t n; char line[MAXLINE],astring[1]="",a,ris[MAXLINE]; int len,i=0,cont; for ( ; ; ) { if ( (n = readln(sockfd, line, MAXLINE)) == 0) return; /* connection closed by other end */ len=strlen(line); cont=1; for (i=0;i<len;i++) { a=line[i]; sprintf(astring,"%c",a); if(strcmp(astring," ")==0) cont++; } sprintf(ris,"%d",cont); writeln(sockfd, ris, MAXLINE); cont=1; } } Codice:
Client #include "basic.h" void client_echo(FILE *fp, int sockfd); int main(int argc, char **argv) { int sockfd, n; struct sockaddr_in servaddr; if (argc != 2) printf("usage: echotcpcli <IPaddress>"); if ( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) printf("socket error"); bzero(&servaddr, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_port = htons(PORT); /* echo server */ if (inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0) printf("inet_pton error for %s", argv[1]); if (connect(sockfd, (struct sockaddr *) &servaddr, sizeof(servaddr)) < 0) printf("connect error"); client_echo(stdin, sockfd); /* svolge tutto il lavoro del client */ exit(0); } void client_echo(FILE *fp, int sockfd) { char sendline[MAXLINE], recvline[MAXLINE]; while (fgets(sendline, MAXLINE, fp) != NULL) { writeln(sockfd, sendline, strlen(sendline)); if (readln(sockfd, recvline, MAXLINE) == 0) printf("%s: server terminated prematurely",__FILE__); printf("Il numero delle parole è %s\n",&recvline); } } Thanks a lot! ![]()
__________________
Doc : "Ovviamente, il continuum temporale è stato interrotto creando questa nuova temporale sequenza di eventi risultante in questa realtà alternativa" Marty : ... ![]() ![]() |
![]() |
![]() |
![]() |
#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
|
allora server:
Codice:
/* non guardata spero che sia giusta */ void server_echo(int sockfd) { ssize_t n; char line[MAXLINE],astring[1]="",a,ris[MAXLINE]; int len,i=0,cont; for ( ; ; ) { if ( (n = readln(sockfd, line, MAXLINE)) == 0) return; /* connection closed by other end */ len=strlen(line); cont=1; for (i=0;i<len;i++) { a=line[i]; sprintf(astring,"%c",a); if(strcmp(astring," ")==0) cont++; } sprintf(ris,"%d",cont); writeln(sockfd, ris, MAXLINE); cont=1; } } Codice:
/* corretta ma non testata */ int main(void) { pid_t childpid; int listenfd, connfd; struct sockaddr_in servaddr, cliaddr; socklen_t cliaddr_len; /*perchè l'avevi messa nel for? la dimensione di cliaddr non cambia mica.*/ cliaddr_len = sizeof(cliaddr); /*se c'è errore devi ANCHE uscire il programma non può andare avanti */ if( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){ perror("socket error"); exit (EXIT_FAILURE); bzero(&servaddr, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = inet_addr(INADDR_ANY); servaddr.sin_port = htons((u_short) PORT); /* daytime server */ if( (bind(listenfd, (struct sockaddr *) &servaddr, sizeof(servaddr))) < 0){ perror("bind error"); exit (EXIT_FAILURE); } if( listen(listenfd, BACKLOG) < 0 ) perror("listen error"); exit (EXIT_FAILURE); } Codice:
/* preferisco un while(1) che un for (;;) */ while (1){ if( (connfd = accept(listenfd, (struct sockaddr *) &cliaddr, &cliaddr_len)) < 0){ perror("accept error"); exit (EXIT_FAILURE); } childpid = fork (); if (childpid != 0){ close (connfd); } else { server_echo(connfd); /* svolge tutto il lavoro del server */ close(connfd); /* si chiude il socket creato con l'accept NON il socket listensd o come si chiama */ exit(0); } } }
__________________
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 Ultima modifica di Fenomeno85 : 06-09-2005 alle 09:43. |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Nov 2000
Città: Salerno
Messaggi: 4338
|
Ciao,
grazie per le correzioni ![]() Però ci sono readln e writeln che sono comandi non riconosciuti... ![]()
__________________
Doc : "Ovviamente, il continuum temporale è stato interrotto creando questa nuova temporale sequenza di eventi risultante in questa realtà alternativa" Marty : ... ![]() ![]() |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 01:45.