搭车系统 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
- 搭车系统 Server端
- 搭车系统 driver端
- 搭车系统 use端
- 答答搭车系统学习笔记
- 嘀嘀搭车初体验
- 京东苏宁战正酣 搭车营销莫等闲
- 搭车软件大战后疲软
- NOIP评测系统Server端安装步骤
- 各国在日留学生搭车离开仙台防核辐射(组图)
- 吐槽实践学习中的抄袭与搭车
- 视频自媒体时代,健身内容来搭车
- SQL Server系统表
- SQL SERVER系统函数
- SQL Server Build系统
- SQL Server Build系统
- SQL Server系统视图
- SQL SERVER 系统数据库
- SQL Server 系统全局变量
- css3学习笔记-css3选择器
- UIApplicationDelegate分析小结
- select语句的高级应用及实例
- Spring的@Component注解的使用
- JAVA之接口与抽象类详解
- 搭车系统 Server端
- Scala : 面向表达式
- QML--学习第一篇
- JDK源码阅读——Map(HashMap\TreeMap\LinkedHashMap)
- HDOJ 1092 A+B for Input-Output Practice (IV)
- 微信公众号的开发
- 士兵杀敌(一)
- Pholcus初探
- spring 学习笔记