آژانس هواپیماییexchanging

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

شروع موضوع توسط vasighi ‏15 آگوست 2007 در انجمن لینوکس و سیستم عاملهای OpenSource

  1. vasighi

    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*/
    
    }