Ubuntu-服务器(process.c):
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <netinet/ip.h> #include <arpa/inet.h> #include <signal.h> #include <sqlite3.h> #include<time.h> #define DATABASE "my.db" typedef struct { int type; char name[20]; char data[256]; }Mg; void handler(int sig); void do_register(int connfd,Mg *mg,sqlite3 *db); void do_login(int connfd,Mg *mg,sqlite3 *db); void do_client(int connfd,sqlite3 *db); void do_history(int sockfd,Mg *mg,sqlite3 *db); void do_query(int sockfd,Mg *mg,sqlite3 *db); void get_date(char date[]); int do_searchword(int connfd,Mg *mg); int history_callback(void *arg,int f_num,char **f_value,char **f_name); void do_register(int connfd,Mg *mg,sqlite3 *db) { char sqlstr[128]; char *errmsg; sprintf(sqlstr ,"insert into user values ('%s','%s')",mg->name,mg->data); printf("%s\n",sqlstr); if(sqlite3_exec(db,sqlstr,NULL,NULL,&errmsg)!=SQLITE_OK) { sqlite3_free(errmsg); strncpy(mg->data,"user already exist!",256); } else { strncpy(mg->data,"register ok!",256); } send(connfd,mg,sizeof(Mg),0); return; } void do_login(int connfd,Mg *mg,sqlite3 *db) { char sqlstr[128]; char *errmsg; char **result; int row; int column; sprintf(sqlstr,"select *from user where name = '%s' and pass = '%s'",mg->name,mg->data); if(sqlite3_get_table(db,sqlstr,&result,&row,&column,&errmsg)!=SQLITE_OK) { printf("error:%s\n",errmsg); sqlite3_free(errmsg); } if(row == 0) { strncpy(mg->data,"name or passwd is wrong!",256); } else { strncpy(mg->data,"log in ok!",256); mg->type = 3; } send(connfd,mg,sizeof(Mg),0); sqlite3_free_table(result); return; } void get_date(char date[]) { time_t t; struct tm *tp; time(&t); tp = localtime(&t); strftime(date,64,"%Y-%m-%d %H:%M:%S",tp); return; } int do_searchword(int connfd,Mg *mg) { FILE *fp; char s[256]; char *p; if((fp = fopen("dirt.txt","r"))== NULL) { strcpy(mg->data,"dirt on server can't be opened:"); send(connfd,mg,sizeof(Mg),0); } printf("query word is %s\n",mg->data); while(fgets(s,300,fp)!=NULL) { if(0 == strncmp(mg->data,s,strlen(mg->data))) { p = s+strlen(mg->data); while(0==strncmp(p," ",1))p++; strcpy(mg->data,p); send(connfd,mg,sizeof(Mg),0); fclose(fp); return 1; } } fclose(fp); return 0; } void do_client(int connfd,sqlite3 *db) { Mg mg; while(recv(connfd,&mg,sizeof(mg),0)>0) { switch(mg.type) { case 1:do_register(connfd,&mg,db); break; case 2:do_login(connfd,&mg,db); break; case 3:do_query(connfd,&mg,db); break; case 4:do_history(connfd,&mg,db); break; } } printf("client quit\n"); exit(0); return; } int history_callback(void *arg,int f_num,char **f_value,char **f_name) { int connfd; Mg mg; connfd = *(int*)arg; sprintf(mg.data,"%s:%s",f_value[1],f_value[2]); send(connfd,&mg,sizeof(mg),0); return 0; } void do_history(int sockfd,Mg *mg,sqlite3 *db) { char sqlstr[128],*errmsg; sprintf(sqlstr,"select * from record where name = '%s'",mg->name); if(sqlite3_exec(db,sqlstr,history_callback,(void *)&sockfd,&errmsg)!=SQLITE_OK); { printf("error:%s\n",errmsg); sqlite3_free(errmsg); } mg->data[0]='\0'; send(sockfd,mg,sizeof(Mg),0); return ; } void do_query(int sockfd,Mg *mg,sqlite3 *db) { char sqlstr[128],*errmsg; int found = 0; char date[64],word[64]; strcpy(word,mg->data); found = do_searchword(sockfd,mg); if(found) { get_date(date); sprintf(sqlstr,"insert into record values ('%s','%s','%s')",mg->name,date,word); if(sqlite3_exec(db,sqlstr,NULL,NULL,&errmsg)!=SQLITE_OK) { printf("error:%s\n",errmsg); sqlite3_free(errmsg); } } else { strcpy(mg->data,"not found\n"); } send(sockfd,mg,sizeof(Mg),0); return ; } void handler(int sig) //当子进程退出,回收子进程资源 { printf("child exit\n"); while (waitpid(-1, NULL, WNOHANG) > 0); } int main(int argc, char *argv[]) { int listenfd; int ret; socklen_t addrlen; int connfd; char buf[256]; struct sockaddr_in srvaddr; struct sockaddr_in cltaddr; pid_t pid; sqlite3 *db; if(sqlite3_open(DATABASE,&db)!=SQLITE_OK) { printf("error;%s\n",sqlite3_errmsg(db)); exit(-1); } listenfd = socket(AF_INET, SOCK_STREAM, 0); if (listenfd == -1) { perror("server->socket"); return -1; } printf("create listenfd = %d success\n", listenfd); memset(&srvaddr, 0, sizeof(struct sockaddr_in)); srvaddr.sin_family = AF_INET; srvaddr.sin_port = htons(9999); srvaddr.sin_addr.s_addr = inet_addr("192.168.6.138"); ret = bind(listenfd, (const struct sockaddr *)&srvaddr, sizeof(srvaddr)); if (ret == -1) { perror("server->bind"); return -1; } printf("bind success !\n"); ret = listen(listenfd, 1024); if (ret == -1) { perror("server->listen"); return -1; } printf("listen success !\n"); signal(SIGCHLD, handler); while(1) { memset(&cltaddr, 0, sizeof(cltaddr)); addrlen = sizeof(cltaddr); connfd = accept(listenfd, (struct sockaddr *)&cltaddr, &addrlen); if (connfd == -1) { return -1; } printf("connect connfd = %d\n", connfd); char *p = inet_ntoa((struct in_addr)cltaddr.sin_addr); printf("clt->ip : %s\n", p); printf("clt->port : %d\n", ntohs(cltaddr.sin_port)); pid = fork(); if (pid == -1) { perror("server->fork"); return -1; } else if (pid == 0) { do_client(connfd,db); } close(connfd); } close(listenfd); return 0; }
QT-客户端:
widget.h
#ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include <QDebug> #include <QHostAddress> #include <QTcpSocket> #include <QMessageBox> #include "search.h" typedef struct { int type; char name[20]; char data[256]; }Mg; namespace Ui { class Widget; } class Widget : public QWidget { Q_OBJECT public: explicit Widget(QWidget *parent = 0); ~Widget(); public slots: void send_msg(); void recv_msg(); private slots: void on_reg_clicked(); void on_log_clicked(); void on_quit_clicked(); private: Ui::Widget *ui; QTcpSocket *tcpclient; };
#endif // WIDGET_H
widget.cpp:
#include "widget.h" #include "ui_widget.h" Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) { ui->setupUi(this); setWindowTitle("系统登录注册界面"); tcpclient = new QTcpSocket(this); tcpclient->connectToHost("192.168.6.138",9999);//INADDR_ANY if(tcpclient->waitForConnected()) qDebug()<<"connect server success..."; else qDebug()<<"connect server fail..."; // connect(ui->le1,SIGNAL(returnPressed()),this,SLOT(send_msg()));//发送的信号槽 // connect(ui->le2,SIGNAL(returnPressed()),this,SLOT(send_msg()));//发送的信号槽 connect(tcpclient,SIGNAL(readyRead()),this,SLOT(recv_msg()));//接收的信号槽 } Widget::~Widget() { delete ui; } void Widget::send_msg() { } void Widget::recv_msg() { Mg mg; tcpclient->read((char *)(&mg),sizeof(Mg)); /*打印注册或登陆的成功或失败信息*/ QMessageBox msgBox; msgBox.setText(mg.data); msgBox.exec(); /*打印注册或登陆的成功或失败信息*/ qDebug()<<"****************"; qDebug()<<mg.name<< mg.data; qDebug()<<"****************"; /*打印注册或登陆的成功或失败信息*/ ui->textEdit->append(mg.data); /*登陆成功则跳转*/ if(mg.type == 3) { /*跳转到查询界面*/ Search *p = new Search; p->show(); } } void Widget::on_reg_clicked() { Mg mg; mg.type = 1; strcpy(mg.name,ui->le1->text().toStdString().c_str()); strcpy(mg.data,ui->le2->text().toStdString().c_str()); if(strlen(mg.data)!=0 && strlen(mg.name)!=0) { tcpclient->write((char *)(&mg),sizeof(Mg)); } else { QMessageBox msgBox; msgBox.setText("user or passwd can't be empty!"); msgBox.exec(); } qDebug()<<"name: "<<mg.name<<" "<<"passwd: "<<mg.data<<endl; ui->le1->clear(); ui->le2->clear(); } void Widget::on_log_clicked() { Mg mg; mg.type = 2; strcpy(mg.name,ui->le1->text().toStdString().c_str()); strcpy(mg.data,ui->le2->text().toStdString().c_str()); if(strlen(mg.data)!=0 && strlen(mg.name)!=0) { tcpclient->write((char *)(&mg),sizeof(Mg)); } else { QMessageBox msgBox; msgBox.setText("user or passwd can't be empty!"); msgBox.exec(); } qDebug()<<"name: "<<mg.name<<" "<<"passwd: "<<mg.data<<endl; ui->le1->clear(); ui->le2->clear(); } void Widget::on_quit_clicked() { qDebug()<<"exit success!"; exit(0); }
search.h:
#ifndef SEARCH_H #define SEARCH_H #include <QDialog> #include <QDebug> #include <QHostAddress> #include <QTcpSocket> #include "widget.h" namespace Ui { class Search; } class Search : public QDialog { Q_OBJECT public: explicit Search(QWidget *parent = 0); ~Search(); public slots: void reg_send_msg(); void reg_recv_msg(); private slots: void on_pt_clicked(); void on_pt1_clicked(); void on_pt2_clicked(); void on_pt3_clicked(); private: Ui::Search *ui; QTcpSocket *seaclient; }; #endif // SEARCH_H
search.cpp:
#include "search.h" #include "ui_search.h" Search::Search(QWidget *parent) : QDialog(parent), ui(new Ui::Search) { ui->setupUi(this); setWindowTitle("查询界面"); seaclient = new QTcpSocket(this); seaclient->connectToHost("192.168.6.138",9999);//INADDR_ANY if(seaclient->waitForConnected()) qDebug()<<"connect server success..."; else qDebug()<<"connect server fail..."; //connect(ui->le1,SIGNAL(returnPressed()),this,SLOT(reg_send_msg()));//发送的信号槽 //connect(ui->le2,SIGNAL(returnPressed()),this,SLOT(reg_send_msg()));//发送的信号槽 connect(seaclient,SIGNAL(readyRead()),this,SLOT(reg_recv_msg()));//接收的信号槽 } Search::~Search() { delete ui; } void Search::reg_send_msg() { } void Search::reg_recv_msg() { Mg mg; seaclient->read((char *)(&mg),sizeof(Mg)); ui->le2->setText(mg.data); ui->te->append(mg.data); } /*查询单词*/ void Search::on_pt1_clicked() { Mg mg; mg.type = 3; strcpy(mg.data,ui->le1->text().toStdString().c_str()); seaclient->write((char *)(&mg),sizeof(Mg)); } /*退出查询界面*/ void Search::on_pt2_clicked() { qDebug()<<"exit search success!"; //exit(0);//退出所有进程... this->close(); } /*历史记录*/ void Search::on_pt3_clicked() { Mg mg; mg.type = 4; seaclient->write((char *)(&mg),sizeof(Mg)); }
