QT-在线词典

xiaoxiao2021-02-28  127

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)); }

转载请注明原文地址: https://www.6miu.com/read-39769.html

最新回复(0)