View Single Post
Old 05-09-2005, 16:00   #1
Fire Fox II
Senior Member
 
L'Avatar di Fire Fox II
 
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);
        }
}
Cosa ho sbagliato?

Thanks a lot!
__________________
Doc : "Ovviamente, il continuum temporale è stato interrotto creando questa nuova temporale sequenza di eventi risultante in questa realtà alternativa"
Marty : ...... "Che lingua è, Doc?!?"
Fire Fox II è offline   Rispondi citando il messaggio o parte di esso