搭车系统 Server端

来源:互联网 发布:淘宝 饰品店 利润 编辑:程序博客网 时间:2024/04/29 01:43

servermain.cpp

#include<iostream>#include<sys/un.h>#include<sys/types.h>#include<sys/socket.h>#include<stdlib.h>#include<netinet/in.h>#include<arpa/inet.h>#include<unistd.h>#include<iomanip>#include<string.h>#include<stdio.h>#include<pthread.h>#include<fstream>#include<map>#include<set>#include"message_type.h"#include"server.h"using namespace std;int main(){        udp_main();        tcp_main();        return 0;    }

server.h

#ifndef  _SERVER_H_#define  _SERVER_H_#include <map>#include <set>#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>static int server_tcp_sockfd;#define   DRIVER_FILE       "driver.txt"#define   USER_FILE         "user.txt"struct package{    int sockfd;    int len;};struct APINFO{    char account[1024]={0};    char password[1024]={0};    int  balance=100;    };struct NETINFO{    struct sockaddr_in sockaddr;    int tcp=0 ;    int udp=0 ;    };struct ADDRESSINFO{     int startjd=0;     int startwd=0;     int goaljd=0 ;     int goalwd =0;    };struct PERINFO{    char name[256]={0};    char sex[10]={0};    char IDcard[20]={0};    char homeadd[1024]={0};    char phonenum[20]={0};    char carnum[256]="0000"; };     struct ALLINFO{    struct APINFO  apinfo;    struct NETINFO  netinfo;    struct ADDRESSINFO addressinfo;    struct PERINFO  perinfo;        };struct USERINFO{    char account[1024]={0};    struct sockaddr_in useraddr;    struct ADDRESSINFO addressinfo;    struct PERINFO perinfo;    };struct CHATINFO{    char recvaccount[1024]={0};    char sendtoaccount[1024]={0};    char buff[1024]={0};    };static std::set<std::string> request_list;static std::map<std::string , struct ALLINFO>  clientmap;static void create_thread_function( int , size_t ,void*(*fp)(void*));void*save_user_accountpassword(void * );void tcp_main();void* user_tcp_login(void* ) ;  void* user_order(void* );void add_show(ADDRESSINFO &);void*save_driver_accountpassword(void * );void*driver_tcp_login(void*);void* save_driver_GPS(void* );void* driver_task(void* );void* user_task_driverinfo(void* );void* chat_main(void* );void udp_main();#endif

server.cpp

#include<iostream>#include<sys/un.h>#include<sys/types.h>#include<sys/socket.h>#include<stdlib.h>#include<netinet/in.h>#include<arpa/inet.h>#include<unistd.h>#include<iomanip>#include<string.h>#include<string>#include<stdio.h>#include<pthread.h>#include<fstream>#include<set>#include<map>#include"message_type.h"#include"server.h"using namespace std;void tcp_main(){    int ret ;       int sockfd;    struct sockaddr_in  serveraddr;     struct message message ;       sockfd = socket(AF_INET , SOCK_STREAM, 0);    //设置服务器地址    serveraddr.sin_family = AF_INET ;    serveraddr.sin_port = htons(8000);    serveraddr.sin_addr.s_addr = INADDR_ANY ;    //绑定----tcp ----udp----    ret = bind (sockfd , (struct sockaddr*)&serveraddr , sizeof(struct sockaddr_in));    if(ret == -1){          cout <<"tcp bind fail" << endl;        exit(1);    }      listen(sockfd , 5);      cout <<" //等待与客服端建立链接" <<endl;    while(1){           server_tcp_sockfd = accept(sockfd , 0 , 0 );        cout << " server TCP  响应请求" << endl;        read(server_tcp_sockfd ,&message , sizeof(message) );    //进行消息分类处理        switch(message.type)        {               case 1000:                {                   cout <<" 司机上报GPS" << endl;                create_thread_function(server_tcp_sockfd , message.type_len,save_driver_GPS );                break ;                }            case 1002 :                {                cout << "司机注册"<< endl;                create_thread_function(server_tcp_sockfd , message.type_len,save_driver_accountpassword ) ;                 }                break ;             case 1003 :                {                       cout << "司机登录" << endl;                create_thread_function(server_tcp_sockfd , message.type_len, driver_tcp_login );                }                break ;            case 1004 :                  {   //司机退出        //      int driver_tcp_sockfd = server_tcp_sockfd ;            //  close(server_tcp_sockfd);                   break ;                }            case 1006 :                     {                cout <<"进入聊天服务"<<endl;                  }                getchar();                break ;            case 1007 :                         break ;            case 1008 :                 {                cout << "司机接任务,确定了乘客" << endl;                create_thread_function(server_tcp_sockfd , message.type_len ,driver_task );                 }                break ;            case 1009 :                     //关单                //太多了 省略                break ;            case 2000 :                {                   cout <<"乘客注册"<< endl;                   create_thread_function(server_tcp_sockfd , message.type_len,save_user_accountpassword );                }                break ;            case 2001 :                 {                cout << "乘客登录"<< endl;                create_thread_function(server_tcp_sockfd , message.type_len ,user_tcp_login);                   }                break ;            case 2002 :                {   //乘客退出        //      int client_tcp_sockfd = server_tcp_sockfd ;        //      close(client_tcp_sockfd);                break ;                }            case 2003 :                 {                cout<<" 乘客下单 要求订车"<< endl;                create_thread_function(server_tcp_sockfd , message.type_len ,user_order);                   }                break ;            case 2004 :                 break ;            case 2005 :                {                cout <<"下载司机信息  "<< endl;                create_thread_function(server_tcp_sockfd , message.type_len ,user_task_driverinfo);                 }                break ;            default  :                break ;        }    }}//-------create_thread_all_function-------void create_thread_function( int sockfd , size_t len ,void*(*fp)(void*)){    int ret ;    pthread_t thread_t ;    struct package*  p = new  package;    p->sockfd = sockfd;    p->len  = len;    ret = pthread_create(&thread_t , NULL , fp ,(void*)p);    if(ret != 0){        cout <<"pthread_all_create fail"<< endl;        exit(1);    }}void*save_user_accountpassword(void * arg){    int ret ;    struct package* p = (struct package*)arg;    int  sockfd = p->sockfd;    int  len = p->len;    struct AP ap;    ret=read(sockfd ,&ap, len);    ap_show(ap);     string str = ap.account;     map<string ,ALLINFO>::iterator its = clientmap.find(str) ;     if(its == clientmap.end()){        ofstream  file_fd;        file_fd.open(USER_FILE,ios::app);        //写入文件保存        file_fd<<ap.account<<endl;        file_fd<<ap.password<<endl;        file_fd.close();        ALLINFO allinfo;        strcpy(allinfo.apinfo.account,ap.account);        strcpy(allinfo.apinfo.password,ap.password);        clientmap.insert(make_pair(str , allinfo));        cout <<"map==="<<endl;        map<string ,ALLINFO>::iterator itss = clientmap.find(str);        cout << itss->first<< endl;        cout << (itss->second).apinfo.password<< endl;        cout << (itss->second).apinfo.balance<< endl;        //返回1111成功标志        struct message  message;        message.type = 1111;            write (sockfd , &message , sizeof(struct message));        read(sockfd , &(itss->second).perinfo , sizeof(PERINFO));        cout << "ID CEAR=="<<(itss->second).perinfo.IDcard<< endl;    }else{        struct message  message;        message.type= 0;        write (sockfd , &message , sizeof(struct message));    }    if(p){        delete p;        p = NULL ;    }    close(sockfd);    pthread_exit ( (void*)0 );} void*save_driver_accountpassword(void * arg){    int ret ;    struct package* p = (struct package*)arg;    int  sockfd = p->sockfd;    int  len = p->len;    struct AP ap;    ret=read(sockfd ,&ap, len);    ap_show(ap);     string str = ap.account;     map<string ,ALLINFO>::iterator its = clientmap.find(str) ;     if(its == clientmap.end()){        ofstream  file_fd;        file_fd.open(DRIVER_FILE,ios::app);        //写入文件保存        file_fd<<ap.account<<endl;        file_fd<<ap.password<<endl;        file_fd.close();        ALLINFO allinfo;        strcpy(allinfo.apinfo.account,ap.account);        strcpy(allinfo.apinfo.password,ap.password);        clientmap.insert(make_pair(str , allinfo));        //返回1111成功标志        struct message  message;        message.type = 1111;            write (sockfd , &message , sizeof(struct message));        map<string ,ALLINFO>::iterator itss = clientmap.find(str) ;        read(sockfd , &(itss->second).perinfo , sizeof(PERINFO));    }else{        struct message  message;        message.type= 0;        write (sockfd , &message , sizeof(struct message));    }    if(p){        delete p;        p = NULL ;    }    close(sockfd);    pthread_exit ( (void*)0 );} void* user_tcp_login(void*arg){    struct package* p = (struct package*)arg;    int  sockfd = p->sockfd;    int  len = p->len;    AP  ap;    read(sockfd ,&ap,len);    cout << "登录的信息为"<< endl;    ap_show(ap);    cout << endl;    struct message  message;    string str1 = ap.account;    string str2 = ap.password;    string str3;    map<string , ALLINFO>::iterator its =clientmap.find(str1);    if((its != clientmap.end())&&(str2 == (str3=(its->second).apinfo.password))){        message.type = 1111;        write(sockfd ,&message , sizeof(message));        //写入IP        read(sockfd , &(its->second).netinfo.sockaddr , sizeof(sockaddr_in));    }else{        message.type = 0;        write(sockfd ,&message , sizeof(message));    }    if(p){    delete p;    p = NULL ;    }       pthread_exit ( (void*)0 );}   void* driver_tcp_login(void*arg){    struct package* p = (struct package*)arg;    int  sockfd = p->sockfd;    int  len = p->len;    AP  ap;    read(sockfd ,&ap,len);    cout <<"司机登录的信息为"<< endl;    ap_show(ap);    cout << endl;    struct message  message;    string str1 = ap.account;    string str2 = ap.password;    string str3;    map<string , ALLINFO>::iterator its =clientmap.find(str1);    if((its != clientmap.end())&&(str2 == (str3=(its->second).apinfo.password))){        message.type = 1111;        write(sockfd ,&message , sizeof(message));        //写入IP        read(sockfd , &(its->second).netinfo.sockaddr , sizeof(sockaddr_in));    }else{        message.type = 0;        write(sockfd ,&message , sizeof(message));    }    if(p){    delete p;    p = NULL ;    }       pthread_exit ( (void*)0 );}       void* user_order(void* arg){    char clientaccount[1024]={0};    struct package* p = (struct package*) arg;    int  sockfd = p->sockfd;    int  len = p->len;    ADDRESSINFO addressinfo;    read(sockfd ,&clientaccount, len);    string str = clientaccount;    read(sockfd ,&addressinfo, sizeof(addressinfo));    map<string , ALLINFO >::iterator its = clientmap.find(str);    if(its != clientmap.end() ){        struct message  message ;        message.type = 1111;        write(sockfd , &message , sizeof(message));        //写入TCP         (its->second).netinfo.tcp = sockfd;        cout << "suer tcp "<< sockfd << endl;        cout << (its->second.netinfo.tcp)<< endl;        //添加到请求链表        request_list.insert(str);        //完成地址更新        (its->second).addressinfo=addressinfo;        }          add_show(its->second.addressinfo);    if(p){    delete p;    p = NULL ;    }    return (void*) 0;   }   void* save_driver_GPS(void* arg){    char driveraccount[1024]={0};    struct package* p = (struct package*) arg;    int  sockfd = p->sockfd;    int  len = p->len;    ADDRESSINFO addressinfo;    read(sockfd ,&driveraccount, len);    string str = driveraccount;    read(sockfd ,&addressinfo, sizeof(addressinfo));    map<string , ALLINFO >::iterator its = clientmap.find(str);    if(its != clientmap.end() ){        struct message  message ;        USERINFO userinfo;        int i=0;        message.type = 1111;        //写入TCP         (its->second).netinfo.tcp = sockfd;        //完成地址更新        (its->second).addressinfo=addressinfo;        add_show(its->second.addressinfo);        write(sockfd , &message , sizeof(message));        map<string ,ALLINFO>::iterator it ;        set<string>:: iterator itss = request_list.begin();        while(itss != request_list.end()){                strcpy(userinfo.account , (*itss).c_str());                it = clientmap.find(*(itss));                userinfo.useraddr= (it->second).netinfo.sockaddr;                userinfo.addressinfo = (it->second).addressinfo;                strcpy(userinfo.perinfo.name , (it->second).perinfo.name);                strcpy(userinfo.perinfo.sex , (it->second).perinfo.sex);                strcpy(userinfo.perinfo.IDcard , (it->second).perinfo.IDcard);                strcpy(userinfo.perinfo.homeadd , (it->second).perinfo.homeadd);                strcpy(userinfo.perinfo.phonenum , (it->second).perinfo.phonenum);                write(sockfd , &userinfo , sizeof(userinfo));                ++itss;            }            close(sockfd);        }     if(p){    delete p;    p = NULL ;    }    return (void*) 0;   }   void add_show(ADDRESSINFO &rh){    system("clear");    std::cout <<"=========您输入的行程============"<< std::endl;    std::cout << std::endl;    std::cout << "出发地经纬度 :" << rh.startjd<<":"<< rh.startwd<<std::endl;     std::cout << "目的地经纬度 :" << rh.goaljd<< ":"<<rh.goalwd << std::endl;    std::cout << std::endl;    std::cout << "======================================="<<std::endl;    }       void* driver_task(void* arg){    int ret ;    struct package* p = (struct package*)arg;    int  sockfd = p->sockfd;    int  len = p->len;    char useraccount[1024]={0};    char driveraccount[1024]={0};    read(sockfd ,useraccount , len);    string str= useraccount;    read(sockfd ,driveraccount, sizeof(driveraccount));    map<string ,ALLINFO>::iterator its = clientmap.find(str);    set<string>::iterator itss = request_list.find(str);    struct message message;    if(itss != request_list.end()){        int user_tcp_sockfd = (its->second).netinfo.tcp;        message.type= 1111;        cout << "use_tcp_sockfd"<< user_tcp_sockfd << endl;        write(user_tcp_sockfd , driveraccount , sizeof(driveraccount));        cout << "=========================="<<endl;        write(sockfd ,&message, sizeof(message));        request_list.erase(str);        sleep(1);        close(user_tcp_sockfd);    }else{        message.type= 0;         write(sockfd , &message , sizeof(message));     }    if(p){    delete p;    p = NULL ;    }    close(sockfd);    return (void*) 0;}void* user_task_driverinfo(void* arg){    char driveraccount[1024]={0};    struct package* p = (struct package*) arg;    int  sockfd = p->sockfd;    int  len = p->len;    read(sockfd ,driveraccount, len);    string str = driveraccount;    map<string , ALLINFO >::iterator its = clientmap.find(str);    if(its != clientmap.end() ){        USERINFO userinfo;        strcpy(userinfo.account , (its->first).c_str());        userinfo.useraddr= (its->second).netinfo.sockaddr;        userinfo.addressinfo = (its->second).addressinfo;        strcpy(userinfo.perinfo.name , (its->second).perinfo.name);        strcpy(userinfo.perinfo.sex , (its->second).perinfo.sex);        strcpy(userinfo.perinfo.IDcard , (its->second).perinfo.IDcard);        strcpy(userinfo.perinfo.homeadd , (its->second).perinfo.homeadd);        strcpy(userinfo.perinfo.phonenum , (its->second).perinfo.phonenum);        strcpy(userinfo.perinfo.carnum , (its->second).perinfo.carnum );        write(sockfd , &userinfo , sizeof(userinfo));        sleep(1);        close(sockfd);    }else{        USERINFO userinfo;          write(sockfd , &userinfo , sizeof(userinfo));        sleep(1);        close(sockfd);        }    if(p){    delete p;    p = NULL ;    }    return (void*) 0;   }   void udp_main(){    pthread_t thread;    pthread_create(&thread , NULL , chat_main , (void*)0);      }void* chat_main(void* arg){    int ret ;       int sockfd;    struct sockaddr_in  serveraddr;     struct sockaddr_in  clientaddr;    socklen_t clientlen = sizeof(clientaddr);    CHATINFO chatinfo;    map<string , ALLINFO>::iterator its ;    string str;    sockfd = socket(AF_INET , SOCK_DGRAM, 0);    //设置服务器地址    serveraddr.sin_family = AF_INET ;    serveraddr.sin_port = htons(8000);    serveraddr.sin_addr.s_addr = INADDR_ANY ;    socklen_t  serverlen = sizeof(sockaddr_in);     //绑定- ---udp----    ret = bind (sockfd , (struct sockaddr*)&serveraddr , sizeof(struct sockaddr_in));    if(ret == -1){          cout <<"udp bind fail" << endl;        exit(1);    }    cout<<"udp 相应"<< endl;    while(1){        recvfrom(sockfd , (void*)&chatinfo , (size_t)sizeof(CHATINFO) ,0 , (struct sockaddr*)&serveraddr ,&serverlen);        str= chatinfo.recvaccount;        its= clientmap.find(str);        if(its != clientmap.end()){            clientaddr = (its->second).netinfo.sockaddr;            sendto(sockfd , (void*)&chatinfo , sizeof(CHATINFO) ,0 , (struct sockaddr*)&clientaddr ,clientlen );            }           }    return (void*) 0;       }

struct_info.h

#ifndef _STRUCT_INFO_#define _STRUCT_INFO_struct INFO {    int ID ;              unsigned long int clientIP  ;   // 客户IP    unsigned long int driverIP ;    //司机IP    long int longitude ;            //维度     long int datitude ;             //经度    int client_tcp_sockfd ;         //客户与服务器TCP接口    int driver_tcp_sockfd ;         //司机与服务器TCP接口};void driver_info_show(struct INFO & );void client_info_show(struct INFO & );static  int INFO_LEN = sizeof(struct INFO);#endif 

message_type.h

#ifndef _MESSAGE_TYPE_#define _MESSAGE_TYPE_#define  MAXBUFF   1024static bool pth;struct message{    int type ;    size_t type_len ;   };static int  message = sizeof(struct message);struct AP{        char account[1024]={0};        char password[1024]={0};    };static void ap_show(AP &rh){    std::cout <<"========================================="<< std::endl;    std::cout << "account :" << rh.account<<std::endl;      std::cout << std::endl;    std::cout << "password :"<< rh.password<< std::endl;    std::cout << std::endl;    std::cout << "======================================="<<std::endl;    }#endif
0 0
原创粉丝点击