今日进展:
ser.h
cpp
#include<iostream>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<string>
#include<netinet/in.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<event.h>
#include<jsoncpp/json/json.h>
#include<mysql/mysql.h>
using namespace std;
const int listenmax=10;
enum op_type{
DL=1,
ZC,
CKYY,
YD,
CKYD,
QXYD,
TC
};
class mysql_client{
public:
mysql_client(){
db_ips="127.0.0.1";
db_username="root";
db_dbname="project_db";
db_passwd="770202";
}
~mysql_client(){
mysql_close(&mysql_con);
}
bool mysql_connectserver();
bool mysql_register(const string &tel,const string &passwd,const string &name);
private:
MYSQL mysql_con;
string db_ips;
string db_username;
string db_dbname;
string db_passwd;
};
class socket_listen{
public:
socket_listen(){
sockfd=-1;
m_port=6000;
m_ips="127.0.0.1";
}
socket_listen(string ips,short port):m_ips(ips),m_port(port){
sockfd=-1;
}
bool socket_init();
int accept_client();
void set_base(struct event_base*base){
this->base=base;
}
int getsockfd()const{
return sockfd;
}
struct event_base* get_base()const{
return base;
}
private:
int sockfd;
short m_port;
string m_ips;
struct event_base * base;
};
class socket_con{
public:
socket_con(int fd):c(fd){
c_ev=NULL;
}
void set_ev(struct event*ev){
c_ev=ev;
}
~socket_con(){
event_free(c_ev);
close(c);
}
void recv_data();
void send_err();
void send_ok();
void user_register();
void user_login();
private:
int c;
struct event* c_ev;
Json::Value val;
//mysql_client cli;
};
ser.cpp
cpp
#include"ser.h"
bool mysql_client::mysql_connectserver(){
MYSQL*mysql=mysql_init(&mysql_con);
if(mysql==NULL)return false;
mysql=mysql_real_connect(mysql,db_ips.c_str(),db_username.c_str(),db_passwd.c_str(),db_dbname.c_str(),3306,NULL,0);
if(mysql==NULL){
cout<<"connect db server err"<<endl;
return false;
}
return true;
}
bool mysql_client::mysql_register(const string &tel,const string &passwd,const string &name){
//insert into user_info values(0,'13200000000','小王','123456',1);
string sql=string("insert into user_info values(0,'")+tel+string("','")+name+string("','")+passwd+string("',1)");
if(mysql_query(&mysql_con,sql.c_str())!=0)return false;
return true;
}
//socket_listen
bool socket_listen::socket_init(){
sockfd=socket(AF_INET,SOCK_STREAM,0);
if(-1==sockfd)return false;
struct sockaddr_in saddr;
memset(&saddr,0,sizeof(saddr));
saddr.sin_family=AF_INET;
saddr.sin_port=htons(m_port);
saddr.sin_addr.s_addr=inet_addr(m_ips.c_str());
int res=bind(sockfd,(struct sockaddr*)&saddr,sizeof(saddr));
if(-1==res){
perror("绑定失败\n");
close(sockfd);
return false;
}
res=listen(sockfd,listenmax);
if(res==-1)return false;
return true;
}
int socket_listen::accept_client(){
int c=accept(sockfd,NULL,NULL);
return c;
}
//socket_con
void socket_con::send_err(){
Json::Value res_val;
res_val["status"]="ERR";
send(c,res_val.toStyledString().c_str(),strlen(res_val.toStyledString().c_str()),0);
}
void socket_con::send_ok(){
Json::Value res_val;
res_val["status"]="OK";
send(c,res_val.toStyledString().c_str(),strlen(res_val.toStyledString().c_str()),0);
}
void socket_con::user_register(){
string tel,passwd,username;
tel=val["user_tel"].asString();
passwd=val["user_passwd"].asString();
username=val["user_name"].asString();
if(tel.empty()||passwd.empty()||username.empty()){
send_err();
}
mysql_client cli;
if(!cli.mysql_connectserver()){
send_err();
return;
}
if(!cli.mysql_register(tel,passwd,username)){
send_err();
return;
}
send_ok();
return;
}
void socket_con::user_login(){
}
void socket_con::recv_data(){
char buff[256]={0};
int n=recv(c,buff,255,0);
if(n<=0){
cout<<"client close"<<endl;
delete this;
return;
}
//测试
cout<<"recv:"<<buff<<endl;
Json::Reader Read;
if(!Read.parse(buff,val)){
cout<<"recv_data:解析json失败"<<endl;
send_err();
return;
}
int ops=val["type"].asInt();
switch(ops){
case DL://登陆
user_login();
break;
case ZC://注册
user_register();
break;
case CKYY://查看预约
break;
case YD://预订
break;
case QXYD://取消预订
break;
case CKYD://查看预订
break;
case TC://退出
break;
default:
cout<<"输入无效"<<endl;
break;
}
//解析
}
//callback
void SOCK_CON_CALLBACK(int fd,short ev,void *arg){
socket_con*q=(socket_con*)arg;
if(ev&EV_READ){
q->recv_data();
}
}
void SOCK_LIS_CALLBACK(int sockfd,short ev,void *arg){
socket_listen* p=(socket_listen*)arg;
if(p==NULL)return;
if(ev&EV_READ){ //处理读事件
int c=p->accept_client();
if(c==-1)return;
cout<<"accept:c="<<c<<endl;
socket_con *q=new socket_con(c);
struct event*c_ev=event_new(p->get_base(),c,EV_READ|EV_PERSIST,SOCK_CON_CALLBACK,q);
if(c_ev==NULL){
close(c);
delete q;
return;
}
q->set_ev(c_ev);
//添加到libevent
event_add(c_ev,NULL);
}
}
int main(){
//监听套接字
socket_listen socket_ser;
if(!socket_ser.socket_init()){
cout<<"socket init err!"<<endl;
exit(1);
}
//创建libevent base
struct event_base*base=event_init();
if(base==NULL){
cout<<"base null"<<endl;
exit(1);
}
//设置socket_listen中的libevent中的base
socket_ser.set_base(base);
//添加sockfd到libevent
struct event*sock_ev=event_new(base,socket_ser.getsockfd(),EV_READ|EV_PERSIST,SOCK_LIS_CALLBACK,&socket_ser);
event_add(sock_ev,NULL);
//启动事件循环
event_base_dispatch(base);//select poll epoll
//释放资源
event_free(sock_ev);
event_base_free(base);
return 0;
}
cli.h
cpp
#include<iostream>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<string>
#include<netinet/in.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<jsoncpp/json/json.h>
using namespace std;
const int offset=2;
enum op_type{DL=1,ZC,CKYY,YD,CKYD,QXYD,TC};
class socket_client{
public:
socket_client(){
sockfd=-1;
ips="127.0.0.1";
port=6000;
dl_flg=false;
user_op=0;
runing=true;
}
socket_client(string ips,short port){
sockfd=-1;
this->ips=ips;
this->port=port;
dl_flg=false;
user_op=0;
runing=true;
}
void print_info();
~socket_client(){
close(sockfd);
}
bool connnect_server();
void user_register();
void user_login();
void run();
private:
string ips;
short port;
int sockfd;
bool dl_flg;
string username;
string usertel;
int user_op;
bool runing;
};
cli.cpp
cs
#include"cli.h"
bool socket_client::connnect_server(){
sockfd=socket(AF_INET,SOCK_STREAM,0);
if(-1==sockfd){
perror("create socket err!\n");
return false;
}
struct sockaddr_in saddr;
memset(&saddr,0,sizeof(saddr));
saddr.sin_family=AF_INET;
saddr.sin_port=htons(port);
saddr.sin_addr.s_addr=inet_addr(ips.c_str());
int res=connect(sockfd,(struct sockaddr*)&saddr,sizeof(saddr));
if(res==-1){
perror("connect ser err!\n");
return false;
}
cout<<"connect to server success"<<endl;
return true;
}
void socket_client::print_info(){
if(dl_flg){
cout<<"--已登陆-------用户名:"<<username<<"-------"<<endl;
cout<<"1:查看预约 2:预订 3: 查看我的预约 4:取消预约 5:退出"<<endl;
cout<<"-------------------------------------------------"<<endl;
cout<<"请输入选项编号:"<<endl;
cin>>user_op;
user_op+=offset;
}
else{
cout<<"---未登陆-----游客-----"<<endl;
cout<<"1:登陆 2:注册 3: 退出 "<<endl;
cout<<"-----------------"<<endl;
cout<<"请输入选项编号:"<<endl;
cin>>user_op;
if(user_op==3)user_op=TC;
}
}
void socket_client::user_register(){
cout<<"请输入用户手机号码:"<<endl;
cin>>usertel;
cout<<"请输入用户名"<<endl;
cin>>username;
string passwd,tmp;
cout<<"请输入密码:"<<endl;
cin>>passwd;
cout<<"请再次输入密码"<<endl;
cin>>tmp;
if(usertel.empty()||username.empty()){
cout<<"手机或用户名不能为空"<<endl;
return;
}
if(passwd.compare(tmp)!=0){
cout<<"密码不一致"<<endl;
return;
}
Json::Value val;
val["type"]=ZC;
val["user_tel"]=usertel;
val["user_name"]=username;
val["user_passwd"]=passwd;
send(sockfd,val.toStyledString().c_str(),strlen(val.toStyledString().c_str()),0);
char buff[256]={0};
if(recv(sockfd,buff,255,0)<=0){
cout<<"ser close"<<endl;
return;
}
val.clear();
Json::Reader Read;
if(!Read.parse(buff,val)){
cout<<"json 解析失败"<<endl;
return;
}
string s=val["status"].asString();
if(s.compare("OK")!=0){
cout<<"注册失败"<<endl;
return;
}
dl_flg=true;
cout<<"注册成功"<<endl;
return;
}
void socket_client::user_login(){
cout<<"登陆"<<endl;
}
void socket_client::run(){
while(true){
print_info();
switch(user_op){
case DL:
user_login();
break;
case ZC:
user_register();
break;
case CKYY://查看预约
break;
case YD://预订
break;
case QXYD://取消预订
break;
case CKYD://查看预订
break;
case TC://退出
runing=false;
break;
default:
cout<<"输入无效"<<endl;
break;
}
}
}
int main(){
socket_client cli;
if(!cli.connnect_server())exit(1);
cli.run();
exit(0);
}