• پایان فعالیت بخشهای انجمن: امکان ایجاد موضوع یا نوشته جدید برای عموم کاربران غیرفعال شده است

طراحی چت سرور(کمک خیلی ضروری)

vasighi

کاربر تازه وارد
تاریخ عضویت
19 آپریل 2007
نوشته‌ها
21
لایک‌ها
0
با سلام
سوال من راجع به برنامه ای هست که دارم مینویسم

یه برنامه چت سرور که با سی توی لینوکسه

می تونید کمکم کنید تا جای دستور fork رو تو برنامم پیدا کنم؟ در واقع برنامه تا جایی پیش رفته که کلاینت با اسم خودش به سرور کانکت میشه بعد سرور اسمشو می گیره و در آرایه user میذاره حالا باید پیام های اونو به آدرس گیرنده (name2)که داخل پیام( استراکچر msg )هست بفرسته که name2 رو با تمام خانه های آرایه user (آرایه ای از استراکچر user با فیلد های IP,sockfd, name )مقایسه کنه و به sockfd ای بفرسته که name اون با name2 داخل پیام دریافتی یکی باشه...

و اینجا گیر کردم

کد:
/*chatserver*/

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <sys/types.h>

#include <sys/socket.h>

#include <netinet/in.h>

#include <arpa/inet.h>

#include <unistd.h>



#define PORT 9000

#define MAXDATASIZE 100

int main(void)

{ 

struct msg {

char payload[256];

char name1[30];

char name2[30];

};

struct msg msg[100];

// List of users connections to server

struct user {

int sockfd;

char IP[16];

char name[100];

};

struct user user[100];

fd_set master;

fd_set read_fds;

struct sockaddr_in myaddr;

struct sockaddr_in remoteaddr;

int fdmax;

int listener;

int newfd;

char buf[256];

int nbytes;

int yes=1;

int addrlen;

int i,j;

FD_ZERO(&master);

FD_ZERO(&read_fds);



if((listener=socket(AF_INET,SOCK_STREAM,0))==-1)

{ perror("socket");

exit(1);

}

if(setsockopt(listener,SOL_SOCKET,SO_REUSEADDR,&yes,sizeof(int))==-1)

{ perror("setsockopt");

exit(1);

}

myaddr.sin_family=AF_INET;

myaddr.sin_addr.s_addr=INADDR_ANY;

myaddr.sin_port=htons(PORT);



memset(&(myaddr.sin_zero),'\0',8);



if(bind(listener,(struct sockaddr *)&myaddr,sizeof(myaddr))==-1)

{ perror("bind error");

exit(1);

}

if(listen(listener,10)==-1)

{ perror("listen error");

exit(1);

}

FD_SET(listener,&master);

fdmax=listener;

for(;;)

{

read_fds=master;

if(select(fdmax+1,&read_fds,NULL,NULL,NULL)==-1)

{ perror("select error");

exit(1); 

}

for(i=0;i<=fdmax;i++)

{ 

if(FD_ISSET(i,&read_fds))

{ 

if(i==listener)

{

addrlen=sizeof(remoteaddr);

if((newfd=accept(listener,(struct sockaddr *)&remoteaddr,&addrlen))==-1)

perror("accept error");

else{ FD_SET(newfd,&master);

if(newfd>fdmax) 

fdmax=newfd;

// printf("select server:new connection from %s on socket %d\n",inet_ntoa(remoteaddr.sin_addr),newfd); 

user[i].sockfd=newfd;

strcpy(user[i].IP,inet_ntoa(remoteaddr.sin_addr));

printf("select server:new connection from %s on socket %d\n",inet_ntoa(remoteaddr.sin_addr),newfd);

printf("%d\n",user[i].sockfd);

printf("%s\n",user[i].IP);

if((nbytes=recv(user[i].sockfd,msg,sizeof(msg),0))<=0)

{ if(nbytes==0)

{ printf("select server:socket %d hang up\n",user[i].sockfd);

} else{ perror("recv error");

} close(user[i].sockfd);

FD_CLR(user[i].sockfd,&master);

} 

strcpy(user[i].name,msg[0].payload);

printf("%s\n",user[i].name);



}



} else {

if((nbytes=recv(i,msg,sizeof(msg),0))<=0)

{ if(nbytes==0) 

{ printf("select server:socket %d hang up\n",i);

} else{ perror("recv error"); 

} close(i);

FD_CLR(i,&master);

} else { printf("%s",msg[0].payload);printf("%s\n",msg[0].name2);

for(j=0;j<=fdmax;j++)

{ if(FD_ISSET(j,&master))

{if((j!=listener)&&(j!=i)/*||(strcmp(user[j].name,msg[0].name2)==0)*/)

{ if(send(j,msg,nbytes,0)==-1)

{perror("send error");

}

}

}

}

}

} 

}//if(FD_ISSET(i,&read_fds))

}//for(i=0;i<=fdmax;i++)

}//for(;;)

}//END

/*chatserver*/

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <sys/types.h>

#include <sys/socket.h>

#include <netinet/in.h>

#include <arpa/inet.h>

#include <unistd.h>



#define PORT 9000

#define MAXDATASIZE 100

int main(void)

{ 

struct msg {

char payload[256];

char name1[30];

char name2[30];

};

struct msg msg[100];

// List of users connections to server

struct user {

int sockfd;

char IP[16];

char name[100];

};

struct user user[100];

fd_set master;

fd_set read_fds;

struct sockaddr_in myaddr;

struct sockaddr_in remoteaddr;

int fdmax;

int listener;

int newfd;

char buf[256];

int nbytes;

int yes=1;

int addrlen;

int i,j;

FD_ZERO(&master);

FD_ZERO(&read_fds);



if((listener=socket(AF_INET,SOCK_STREAM,0))==-1)

{ perror("socket");

exit(1);

}

if(setsockopt(listener,SOL_SOCKET,SO_REUSEADDR,&yes,sizeof(int))==-1)

{ perror("setsockopt");

exit(1);

}

myaddr.sin_family=AF_INET;

myaddr.sin_addr.s_addr=INADDR_ANY;

myaddr.sin_port=htons(PORT);



memset(&(myaddr.sin_zero),'\0',8);



if(bind(listener,(struct sockaddr *)&myaddr,sizeof(myaddr))==-1)

{ perror("bind error");

exit(1);

}

if(listen(listener,10)==-1)

{ perror("listen error");

exit(1);

}

FD_SET(listener,&master);

fdmax=listener;

for(;;)

{

read_fds=master;

if(select(fdmax+1,&read_fds,NULL,NULL,NULL)==-1)

{ perror("select error");

exit(1); 

}

for(i=0;i<=fdmax;i++)

{ 

if(FD_ISSET(i,&read_fds))

{ 

if(i==listener)

{

addrlen=sizeof(remoteaddr);

if((newfd=accept(listener,(struct sockaddr *)&remoteaddr,&addrlen))==-1)

perror("accept error");

else{ FD_SET(newfd,&master);

if(newfd>fdmax) 

fdmax=newfd;

// printf("select server:new connection from %s on socket %d\n",inet_ntoa(remoteaddr.sin_addr),newfd); 

user[i].sockfd=newfd;

strcpy(user[i].IP,inet_ntoa(remoteaddr.sin_addr));

printf("select server:new connection from %s on socket %d\n",inet_ntoa(remoteaddr.sin_addr),newfd);

printf("%d\n",user[i].sockfd);

printf("%s\n",user[i].IP);

if((nbytes=recv(user[i].sockfd,msg,sizeof(msg),0))<=0)

{ if(nbytes==0)

{ printf("select server:socket %d hang up\n",user[i].sockfd);

} else{ perror("recv error");

} close(user[i].sockfd);

FD_CLR(user[i].sockfd,&master);

} 

strcpy(user[i].name,msg[0].payload);

printf("%s\n",user[i].name);



}



} else {

if((nbytes=recv(i,msg,sizeof(msg),0))<=0)

{ if(nbytes==0) 

{ printf("select server:socket %d hang up\n",i);

} else{ perror("recv error"); 

} close(i);

FD_CLR(i,&master);

} else { printf("%s",msg[0].payload);printf("%s\n",msg[0].name2);

for(j=0;j<=fdmax;j++)

{ if(FD_ISSET(j,&master))

{if((j!=listener)&&(j!=i)/*||(strcmp(user[j].name,msg[0].name2)==0)*/)

{ if(send(j,msg,nbytes,0)==-1)

{perror("send error");

}

}

}

}

}

} 

}//if(FD_ISSET(i,&read_fds))

}//for(i=0;i<=fdmax;i++)

}//for(;;)

}//END



و کد کلاینت

کد:
/*client*/

#include <stdio.h>

#include <sys/types.h>

#include <sys/socket.h>

#include <netinet/in.h>

#include <netdb.h> 

#include <string.h>

#define PORT 9000

#define MAXDATASIZE 100

void error(char *MSG)

{

perror(MSG);

exit(0);

}

int main(int argc, char *argv[])

{

int sockfd, portno, n;

struct sockaddr_in serv_addr;

struct hostent *server;

struct msg {

char payload[256];

char name1[30];

char name2[30];

};

struct msg msg[100];

char buffer[256];

if (argc < 3) {

fprintf(stderr,"usage %s hostname yourname\n", argv[0]);

exit(0);

}

// portno = atoi(argv[2]);

sockfd = socket(AF_INET, SOCK_STREAM, 0);

if (sockfd < 0) 

error("ERROR opening socket");

server = gethostbyname(argv[1]);

if (server == NULL) {

fprintf(stderr,"ERROR, no such host\n");

exit(0);

}

bzero((char *) &serv_addr, sizeof(serv_addr));

serv_addr.sin_family = AF_INET;

bcopy((char *)server->h_addr, 

(char *)&serv_addr.sin_addr.s_addr,

server->h_length);

serv_addr.sin_port = htons(PORT);

if (connect(sockfd,(struct sockaddr *)&serv_addr,sizeof(struct sockaddr)) < 0) 

error("ERROR connecting");



strcpy(msg[0].payload,argv[2]);

printf("%s\n",argv[2]); 

n = write(sockfd,msg,strlen(msg[0].payload));

if (n < 0)

error("ERROR writing to socket"); 

strcpy(msg[0].name1,argv[2]); 

printf("talk to...");

fgets(msg[0].name2,30,stdin);

/* printf("your meesage...");

fgets(msg[0].payload,255,stdin);

n = write(sockfd,msg,sizeof(msg));

if (n < 0)

error("ERROR writing to socket");*/

// bzero(buffer,256);

while(strcasecmp(msg[0].payload,"bye\n")!=0) {

bzero(msg[0].payload,256);

printf("Please enter the message: ");

fgets(msg[0].payload,255,stdin);

n = write(sockfd,msg,sizeof(msg));

if (n < 0) 

error("ERROR writing to socket");

bzero(msg[0].payload,256);

n = read(sockfd,msg,sizeof(msg));

if (n < 0) 

error("ERROR reading from socket");

printf("Here is the message: %s\n",msg[0].payload);



}//while*/

}

/*client*/

#include <stdio.h>

#include <sys/types.h>

#include <sys/socket.h>

#include <netinet/in.h>

#include <netdb.h> 

#include <string.h>

#define PORT 9000

#define MAXDATASIZE 100

void error(char *MSG)

{

perror(MSG);

exit(0);

}

int main(int argc, char *argv[])

{

int sockfd, portno, n;

struct sockaddr_in serv_addr;

struct hostent *server;

struct msg {

char payload[256];

char name1[30];

char name2[30];

};

struct msg msg[100];

char buffer[256];

if (argc < 3) {

fprintf(stderr,"usage %s hostname yourname\n", argv[0]);

exit(0);

}

// portno = atoi(argv[2]);

sockfd = socket(AF_INET, SOCK_STREAM, 0);

if (sockfd < 0) 

error("ERROR opening socket");

server = gethostbyname(argv[1]);

if (server == NULL) {

fprintf(stderr,"ERROR, no such host\n");

exit(0);

}

bzero((char *) &serv_addr, sizeof(serv_addr));

serv_addr.sin_family = AF_INET;

bcopy((char *)server->h_addr, 

(char *)&serv_addr.sin_addr.s_addr,

server->h_length);

serv_addr.sin_port = htons(PORT);

if (connect(sockfd,(struct sockaddr *)&serv_addr,sizeof(struct sockaddr)) < 0) 

error("ERROR connecting");



strcpy(msg[0].payload,argv[2]);

printf("%s\n",argv[2]); 

n = write(sockfd,msg,strlen(msg[0].payload));

if (n < 0)

error("ERROR writing to socket"); 

strcpy(msg[0].name1,argv[2]); 

printf("talk to...");

fgets(msg[0].name2,30,stdin);

/* printf("your meesage...");

fgets(msg[0].payload,255,stdin);

n = write(sockfd,msg,sizeof(msg));

if (n < 0)

error("ERROR writing to socket");*/

// bzero(buffer,256);

while(strcasecmp(msg[0].payload,"bye\n")!=0) {

bzero(msg[0].payload,256);

printf("Please enter the message: ");

fgets(msg[0].payload,255,stdin);

n = write(sockfd,msg,sizeof(msg));

if (n < 0) 

error("ERROR writing to socket");

bzero(msg[0].payload,256);

n = read(sockfd,msg,sizeof(msg));

if (n < 0) 

error("ERROR reading from socket");

printf("Here is the message: %s\n",msg[0].payload);



}//while*/

}
 
بالا