|
|||||||
|
|
|
![]() |
|
|
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 21:50. |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 05:39.



















