|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Nov 2000
Città: Salerno
Messaggi: 4338
|
[C] Problemi con i socket TCP e chat
Salve raga
![]() sono 2 giorni che non riesco a far funzionare un programma che mi permetta di far comunicare diversi client tramite un server... I programmi sono compilati, ma una volta avviati, se scrivo qualcosa, nessuno riceve niente... Non riesco a capire dove sia l'errore ![]() Questi sono i 2 prog Codice:
CLIENT #include "basic.h" void client_echo(FILE *fp, int sockfd, char nick[MAXLINE]); int main(int argc, char **argv) { int sockfd; struct sockaddr_in servaddr; if (argc != 3) 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"); char newut[MAXLINE]; sprintf(newut, "%s è in chat.\n",argv[2]); write(sockfd,newut,strlen(newut)); // argv[2] rappresenta il nick name client_echo(stdin, sockfd, argv[2]); /* svolge tutto il lavoro del client */ exit(0); } void client_echo(FILE *fp, int sockfd, char nick[MAXLINE]) { char sendline[MAXLINE], recvline[MAXLINE], sendstring[MAXLINE]; int maxfd,n; fd_set rset; // inizializza il file descriptor FD_ZERO(&rset); maxfd = MAX(fileno(fp), sockfd) +1; for ( ; ; ) { // inserisce il file descriptor nell'insieme FD_SET(fileno(fp), &rset); FD_SET(sockfd, &rset); if (select(maxfd, &rset, NULL, NULL, NULL) < 0) printf("select error"); if (FD_ISSET(fileno(fp), &rset) ) { // testa se è stato scritto qualcosa su linea di comando if (fgets(sendline, MAXLINE, fp) == NULL) { printf("Errore scrittura\n"); return; } sprintf(sendstring,"%s : %s\n", nick,sendline); if ((reti_writen(sockfd, sendstring, strlen(sendstring))) < 0) printf("Errore scrittura sul socket\n"); } if (FD_ISSET(sockfd, &rset)) { if ( (n=reti_readline(sockfd, recvline, MAXLINE)) < 0) { if (errno == EPIPE) { printf("%s [%d]: server disconnesso",__FILE__,__LINE__); break; } } else if (n == 0) { printf("%s: server terminated prematurely\n",__FILE__); exit(1); } else { printf("%s", recvline); } } } } Codice:
SERVER #include "basic.h" void server_echo(int sockfd); int main(int argc, char **argv) { int listenfd, connfd, sockfd, maxfd, i,maxi,client[FD_SETSIZE],file,ready,u; struct sockaddr_in servaddr, cliaddr; socklen_t clilen; fd_set rset; ssize_t n; char buff[MAXLINE]; 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"); memset(client, 0, FD_SETSIZE); maxfd=listenfd; maxi=-1; for (i=0; i < FD_SETSIZE; i++) client[i] = -1; // inizializza l'array client; client[maxfd]=1; if((file=open("FILE.TXT", O_RDWR|O_CREAT|O_TRUNC,0644)) < 0) printf("errore creazione file\n"); close(file); while(1) { FD_ZERO(&rset); for (i=listenfd;i<=maxfd;i++) if(client[i] !=0) FD_SET(i,&rset); if ( ( ready = select(maxfd+1, &rset, NULL, NULL, NULL))< 0) { printf("select error\n"); exit(1); } if (FD_ISSET(listenfd,&rset)) { clilen=sizeof(cliaddr); if( (connfd = accept(listenfd, (struct sockaddr *) &cliaddr, &clilen)) < 0) { printf("accept error"); exit(1); } for (i=0; i< FD_SETSIZE; i++) if (client[i] < 0) { client[i] = connfd; break; } if (i == FD_SETSIZE) printf("Troppi client\n"); FD_SET(connfd, &rset ); if(connfd>maxfd) maxfd=connfd; if(i>maxi) maxi = i; if(--ready <=0) continue; for (i=0;i<=maxi;i++) { sockfd = client[i]; if (FD_ISSET(client[i], &rset) ) { if ( (n=reti_readline(sockfd,buff, MAXLINE)) == 0) { printf("fd %d chiuso\n", i); close(sockfd); FD_CLR(sockfd, &rset); client[i] = -1; } else { /* fputs(buff, stdout); if((file=open("FILE,TXT",O_RDWR))<0) printf("FILE.TXT open error\n"); lseek(file,-1,SEEK_END); reti_writen(file,buff,n); reti_writen(file,"\n",1); */ for (u = 0;u <=maxfd; u++) if (u != i) reti_writen(client[u],buff,n); // reti_writen(client[i],buff,sizeof(buff)); } if (--ready <=0) break; } } } } } ![]() Thanks ![]()
__________________
Doc : "Ovviamente, il continuum temporale è stato interrotto creando questa nuova temporale sequenza di eventi risultante in questa realtà alternativa" Marty : ... ![]() ![]() Ultima modifica di Fire Fox II : 08-09-2005 alle 20:50. |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 18:22.