QT-在线词典
来源:互联网 发布:手机上怎么删淘宝评论 编辑:程序博客网 时间:2024/04/28 05:15
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));
}
- QT-在线词典
- 在线词典
- 在线日语词典
- 在线日语词典
- 由在线词典想起
- 中文在线词典
- 转贴:在线词典API
- 在线词典API
- php学习 在线词典
- 在线词典的制作
- PHP在线词典项目
- PHP在线词典项目
- 在线词典查询系统
- linux 安装在线词典
- 数据库-在线词典
- Linux 在线词典
- 在线英英词典
- 在线词典功能点提取
- 冒泡排序和简单选择排序实现
- docker安装redis
- 剑指Offer—61—序列号二叉树
- select @@identity的用法
- java编程规范
- QT-在线词典
- memset的坑-易错点
- open-falcon-小米监控工具
- TCP/IP协议小结
- 用正则识别是否是code
- CRM设计思路浅析
- 在Ubuntu 16.04 LTS下安装配置Odoo10
- java三角形的画法
- CSS3--背景效果