zoukankan      html  css  js  c++  java
  • 搭车系统 Server端

    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   1024
    
    static 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
  • 相关阅读:
    应用服务器性能优化总结
    Web性能优化:图片优化
    图片优化
    浏览器端的九种缓存机制介绍
    MySQL 与 MongoDB的操作对比
    js类型判别大合集
    节流函数和防抖函数的注意事项
    前端和后端交互的方式
    js中关于假值和空数组的总结
    LeetCode 367. 有效的完全平方数
  • 原文地址:https://www.cnblogs.com/Sico2Sico/p/5384278.html
Copyright © 2011-2022 走看看