此程序主要是利用tcp传输和sqlite3进行操作的。
程序执行过程部分截图

#在终端输入sqlite3,查看是否安装sqlite3,没有的话先安装sqlite3
sudo apt-get install sqlite3
sudo apt-get install libsqlite3-dev

打开数据库 sqlite3 my.db
然后在里面创建数据库
create table <table_name> (f1 type1, f2 type2,…);

需要在编译选项上加入-lsqlite3

server.c

#include <stdlib.h>
#include <string.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <signal.h>
#include <sqlite3.h>
#include <time.h>#define  N  256 typedef struct _msg
{char types;char name[N] ;char text[N] ;
}msg_t;int login_callback(void*data,int num,char**value,char**name)
{//   int i;*(int * )data = 1 ;
#if 0if(*flag){*flag = 0 ; for(i=0;i<num;i++){printf("%-10s",name[i]);}printf("\n");}for(i=0;i<num;i++){printf("%-10s",value[i]);}printf("\n");#endifreturn 0;}
int process_register(int newsockfd,msg_t *msgp,sqlite3 *db)
{int ret;char *errmsg ;char sqlstr[N] = {0};sprintf(sqlstr,"insert into user values('%s','%s');",msgp->name,msgp->text);printf("sqlstr=%s\n",sqlstr) ;ret = sqlite3_exec(db,sqlstr,NULL,NULL,&errmsg);if(ret != SQLITE_OK){printf("sqlite3_exec:%s\n",errmsg);strcpy(msgp->text,"用户名已经存在,请重新输入");}else {strcpy(msgp->text,"注册成功");}ret = write(newsockfd,msgp,sizeof(msg_t));if(ret < 0){perror("write"); exit(-1);}return 0;
}
int process_login(int newsockfd,msg_t *msgp,sqlite3 *db)
{int ret;char *errmsg ;char sqlstr[N] = {0};int  login_flag = 0 ; sprintf(sqlstr,"select * from user where name='%s' and passwd='%s';",msgp->name,msgp->text);printf("sqlstr=%s\n",sqlstr) ;ret = sqlite3_exec(db,sqlstr,login_callback,&login_flag,&errmsg);if(ret != SQLITE_OK){printf("sqlite3_exec:%s\n",errmsg);}if(login_flag == 1){strcpy(msgp->text,"登录成功");}else {strcpy(msgp->text,"用户或密码错误,请重新输入");}ret = write(newsockfd,msgp,sizeof(msg_t));if(ret < 0){perror("write"); exit(-1);}return 0;
}
char * search_word(char *word)
{FILE * filp;static char line[N] ={0};char newword[100] ;strcpy(newword,word);strcat(newword," ");filp = fopen("./dict.txt","r");if(filp == NULL){perror("fopen") ; exit(-1);}while( fgets(line,N,filp) != NULL ) {if( strncmp(newword,line,strlen(newword)) == 0 )  {printf("%s",line) ;return line ;}}return NULL;
}char * get_localtime()
{static char buf[100] ={0} ;time_t tm;time(&tm);strcpy(buf,ctime(&tm));buf[strlen(buf) -1] = 0 ;return buf;
}int process_query(int newsockfd,msg_t *msgp,sqlite3 *db)
{int ret;char *retp;char *errmsg ;char sqlstr[N] = {0};int  login_flag = 0 ; char word[100] = {0} ;strcpy(word,msgp->text);retp = search_word(word);if(retp == NULL){strcpy(msgp->text,"要查找的单词不存在");ret = write(newsockfd,msgp,sizeof(msg_t));if(ret < 0){perror("write"); exit(-1);}}else {strcpy(msgp->text,retp);sprintf(sqlstr,"insert into record values('%s','%s','%s');",msgp->name,word,get_localtime());printf("sqlstr=%s\n",sqlstr) ;ret = sqlite3_exec(db,sqlstr,NULL,NULL,&errmsg);if(ret != SQLITE_OK){printf("sqlite3_exec:%s\n",errmsg);}ret = write(newsockfd,msgp,sizeof(msg_t));if(ret < 0){perror("write"); exit(-1);}}return 0;
}
int history_callback(void*data,int num,char**value,char**name)
{int i,ret;msg_t msg;char buf[256] ={0};int newsockfd = *(int * )data  ;memset(&msg,0,sizeof(msg_t));msg.types = 'H' ;for(i=0;i<num;i++){sprintf(buf,"%-10s",value[i]);strcat(msg.text,buf);}ret = write(newsockfd,&msg,sizeof(msg_t));if(ret < 0){perror("write"); exit(-1);}return 0;}
int process_history(int newsockfd,msg_t *msgp,sqlite3 *db)
{int ret;char *retp;char *errmsg ;char sqlstr[N] = {0};int  login_flag = 0 ; sprintf(sqlstr,"select * from record where name='%s';",msgp->name);printf("sqlstr=%s\n",sqlstr) ;ret = sqlite3_exec(db,sqlstr,history_callback,&newsockfd,&errmsg);if(ret != SQLITE_OK){printf("sqlite3_exec:%s\n",errmsg);}strcpy(msgp->text,"传输完成");ret = write(newsockfd,msgp,sizeof(msg_t));if(ret < 0){perror("write"); exit(-1);}return 0;
}
// ./a.out 192.168.1.57 8000
// argv[0] argv[1]       aegv[2]
int main(int argc, const char *argv[])
{sqlite3 *db  ;        /* OUT: SQLite db handle */int data = 1 ;int sockfd,ret,newsockfd;struct sockaddr_in myaddr,client;signal(SIGCHLD,SIG_IGN);msg_t msg;if(argc != 3){printf("运行程序时带入ip 和 port\n");exit(-1);}socklen_t addrlen = sizeof(client);sockfd = socket(AF_INET,SOCK_STREAM,0);if(sockfd < 0){perror("socket");exit(-1);}printf("sockfd=%d\n",sockfd);memset(&myaddr,0,sizeof(myaddr));myaddr.sin_family = AF_INET ;myaddr.sin_port   = htons(atoi(argv[2]));myaddr.sin_addr.s_addr   = inet_addr(argv[1]); ret = bind(sockfd,(struct sockaddr *)&myaddr,sizeof(myaddr)) ; // 给socket 一个固定的ip 和端口 if(ret < 0){perror("bind");exit(-1);}ret = listen(sockfd,10);if(ret < 0){perror("listen");exit(-1);}if(sqlite3_open("my.db",&db) != SQLITE_OK){printf("%s\n",sqlite3_errmsg(db));exit(-1);}while(1){newsockfd = accept(sockfd,(struct sockaddr *)&client,&addrlen) ; if(newsockfd < 0){printf("accept");exit(-1);}printf("newsockfd = %d\n",newsockfd);printf("%s and %d\n",inet_ntoa(client.sin_addr),ntohs(client.sin_port));if( fork() == 0){while(1){ret = read(newsockfd,&msg,sizeof(msg_t));if(ret  < 0){printf("read");exit(-1);}else if(ret == 0){break ; }printf("msg.type=%c\n",msg.types);switch(msg.types){case 'R':process_register(newsockfd,&msg,db);break ; case 'L':process_login(newsockfd,&msg,db);break ; case 'Q':process_query(newsockfd,&msg,db);break ; case 'H':process_history(newsockfd,&msg,db);break ; default:break ;}}close(newsockfd);exit(0);}close(newsockfd);}return 0;
}

client.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>#define  N   256
typedef struct _msg
{char types;char name[N] ;char text[N] ;
}msg_t;int process_register(int sockfd,msg_t *msgp)
{int ret;msgp->types = 'R';printf("input your name:");fgets(msgp->name,N,stdin);msgp->name[strlen(msgp->name) -1 ] = 0 ;printf("input your passwd:");fgets(msgp->text,N,stdin);msgp->text[strlen(msgp->text) -1 ] = 0 ;ret = write(sockfd,msgp,sizeof(msg_t));if(ret < 0){perror("write"); exit(-1);}memset(msgp,0,sizeof(msg_t)) ;ret = read(sockfd,msgp,sizeof(msg_t));if(ret < 0){perror("write"); exit(-1);}printf("%s\n",msgp->text);return 0;
}
int process_query(int sockfd,msg_t *msgp)
{int ret;msgp->types = 'Q';while(1){printf("input your word:");fgets(msgp->text,N,stdin);msgp->text[strlen(msgp->text) -1 ] = 0 ;if(strncmp(msgp->text,"#",1) == 0 ) break ;ret = write(sockfd,msgp,sizeof(msg_t));if(ret < 0){perror("write"); exit(-1);}memset(msgp,0,sizeof(msg_t)) ;ret = read(sockfd,msgp,sizeof(msg_t));if(ret < 0){perror("write"); exit(-1);}printf("%s\n",msgp->text);}return 0;
}
int process_history(int sockfd,msg_t *msgp)
{int ret;msgp->types = 'H';ret = write(sockfd,msgp,sizeof(msg_t));if(ret < 0){perror("write"); exit(-1);}memset(msgp,0,sizeof(msg_t)) ;while(1) {ret = read(sockfd,msgp,sizeof(msg_t));if(ret < 0){perror("write"); exit(-1);}if(strncmp(msgp->text,"传输完成",sizeof("传输完成")) == 0)  break ; printf("%s\n",msgp->text);}return 0;
}
int process_login(int sockfd,msg_t *msgp)
{int ret,num;msgp->types = 'L';printf("input your name:");fgets(msgp->name,N,stdin);msgp->name[strlen(msgp->name) -1 ] = 0 ;printf("input your passwd:");fgets(msgp->text,N,stdin);msgp->text[strlen(msgp->text) -1 ] = 0 ;ret = write(sockfd,msgp,sizeof(msg_t));if(ret < 0){perror("write"); exit(-1);}memset(msgp,0,sizeof(msg_t)) ;ret = read(sockfd,msgp,sizeof(msg_t));if(ret < 0){perror("write"); exit(-1);}printf("%s\n",msgp->text);if(strncmp(msgp->text,"登录成功",sizeof("登陆成功")) == 0 ){while(1){printf("*************************************************\n");printf("*1:search word   2: history   3: quit************\n");printf("*************************************************\n");printf("please input your choice >:");scanf("%d",&num);scanf("%*[^\n]");scanf("%*c"); //回收残留在标准输入的字符 switch(num){case 1:process_query(sockfd,msgp); break ; case 2:process_history(sockfd,msgp); break ; case 3:close(sockfd); exit(0);default:break ;}}}return 0;
}// ./a.out 192.168.1.57 8000
int main(int argc, const char *argv[])
{char buf[N] = {0};int sockfd,ret,newsockfd;int num;struct sockaddr_in server,client;msg_t msg;if(argc != 3){printf("运行程序时带入ip 和 port\n");exit(-1);}socklen_t addrlen = sizeof(client);sockfd = socket(AF_INET,SOCK_STREAM,0);if(sockfd < 0){perror("socket");exit(-1);}printf("sockfd=%d\n",sockfd);memset(&msg,0,sizeof(msg));memset(&server,0,sizeof(server));server.sin_family = AF_INET ;server.sin_port   = htons( atoi(argv[2]) );server.sin_addr.s_addr   = inet_addr(argv[1]); ret = connect(sockfd,(struct sockaddr *)&server,sizeof(server)) ;if(ret < 0){perror("connect");exit(-1);}while(1){printf("*************************************************\n");printf("*1:register   2: login    3: quit****************\n");printf("*************************************************\n");printf("please input your choice >:");scanf("%d",&num);scanf("%*[^\n]");scanf("%*c"); //回收残留在标准输入的字符 switch(num){case 1:process_register(sockfd,&msg); break ; case 2:process_login(sockfd,&msg); break ; case 3:close(sockfd); exit(0);default:break ;}}printf(">:");fgets(buf,N,stdin);ret  = write(sockfd,buf,N) ;if(ret < 0){perror("write");exit(-1);}ret = read(sockfd,buf,N);if(ret  < 0){printf("read");exit(-1);}printf("%s\n",buf);close(sockfd);return 0;
}

运行时gcc server.c -o server -lsqlite3
./server 本机ip 端口号
gcc client.c -o client -lsqlite3
./client 本机ip 端口号
此外还需要个词典的文件 。自行解决。

基于TCP的在线词典相关推荐

  1. 【基于TCP的在线词典】

    一.项目名称 基于TCP的在线词典 二.功能 1.新用户使用时需要注册,用户名不可以和已有用户重复. 2.登录时需要校验用户名及密码. 3.输入要查询的单词后返回查询结果,可循环查询,在输入#后退出查 ...

  2. 基于TCP的在线英文词典(使用了sqlite3数据库)

    一,框架搭建 (建议使用代码比较器软件对比着来看) 客户端: #include <stdio.h> #include <stdlib.h> #include <sys/t ...

  3. 基于TCP的在线聊天程序

    在线聊天服务端 import tkinter import tkinter.font as tkFont import socket import threading import time impo ...

  4. 【基于TCP 在线电子词典】

    基于TCP 在线电子词典 项目功能 流程图 客户端 服务器端 功能实现 服务器 客户端 功能演示 注册功能 登录功能 查询单词功能 查询记录 注销登录(返回上级) 不允许重复登录 Ctrl + C注销 ...

  5. 基于 TCP协议和sqlite3数据库的网络电子词典(个人项目)

    一.开发环境:Ubuntu 16.04 二.项目描述: 基于TCP协议的并发服务器设计,采用sql数据库进行数据存储,文件保存历史查询数据,能满足多用户同时登陆,实现用户的注册.登录以及退出,登录成功 ...

  6. 基于linux的在线英汉词典(带源码)

    源码下载: 基于Linux的在线英汉词典-网络基础文档类资源-CSDN文库https://download.csdn.net/download/qq_63626307/86744311?spm=100 ...

  7. 电子词典(基于TCP协议多进程通信和数据库)

    项目:电子词典 项目要求: 登录注册功能,不能重复登录,重复注册.用户信息也存储在数据库中. 单词查询功能 历史记录功能,存储单词,意思,以及查询时间,存储在数据库 基于TCP,支持多客户端连接 采用 ...

  8. 在线计算机科学词典,基于Word2Vec的情感词典自动构建与优化-计算机科学.PDF

    基于Word2Vec的情感词典自动构建与优化-计算机科学.PDF 第 44 卷第1 期 Vo l. 44 No. 1 计算机科学 2017 年 1 月 COMPUTER SCIENCE Ja口.201 ...

  9. 嵌入式学习项目实战 --- 在线词典

    目录 一.前言 二.项目功能 三.程序流程 1.客户端 2.服务器 四.代码实现 1.客户端代码 2.服务器代码 3.Makefile 一.前言 本文学习自[华清远见]的一个开源嵌入式项目在线词典综合 ...

  10. Linux多进程编程之在线词典

    在线词典是基于Linux 多进程并发服务器编程,由服务器端和客户端构成,客户端可以运行在多个不同的主机上连接服务器,服务器对员工信息的操作结果通过数据库sqlite来保存.当用户登录后,根据用户名判断 ...

最新文章

  1. CoordinatorLayout 和 AppBarLayout 实现的局部点击按钮实现折叠和展开
  2. [leetcode]Divide Two Integers
  3. 【springboot】SpringBootTest 测试时, application.properties 文件的查找顺序
  4. Kotlin 喧嚣过后,谈谈 Java 程序员未来的出路
  5. Appium+PythonUI自动化之webdriver 的三种等待方式(强制等待、隐式等待、显示等待)
  6. Java 抽象类和接口的区别
  7. 虚拟机Centos报corruption of in-memory data detected错误的恢复
  8. p(y|x,z)=p(x,y,z)/p(x,z)的解释
  9. qt按钮功能循环触发_Qt事件循环处理
  10. Android开机画面显示
  11. 微分方程的数值解法与程序实现 pdf_数值计算方法·第三部分
  12. swper_Swiper 中文API手册(share)
  13. 骨传导耳机怎么选?一文告诉你骨传导耳机推荐哪个牌子
  14. 什么是国际物流专线?国际快递专线又是什么呢?
  15. php九九乘法表隔行换色,JavaScript实现99乘法表及隔行变色实例代码_javascript技巧...
  16. 北京地铁线路图(最新-非常实用)
  17. 哎呦,这个社会和时代是怎么了呢???
  18. 学完可入狱:《Web渗透测试-基于Kali Linux》经典黑客入门教程
  19. unity3d摄像机跟随物体移动的简单方法
  20. 创建自绘进度条,并在进度条上显示当前进度的百分比

热门文章

  1. jdk官网下载账号登陆
  2. win11找不到开启蓝牙开关,设备管理器也没有蓝牙
  3. JavaWeb项目实战
  4. 芝士超人复活卡软件多线程版本
  5. Hadoop实战经验之HDFS故障排除-尚硅谷大数据培训
  6. 趣学算法 陈小玉 书中所有问题的实现代码
  7. zigbee CC2530 系列教程 14 蓝牙控制实验
  8. scratch3 打幽灵游戏
  9. 微信小程序引入iconfont实现添加自定义颜色图标
  10. python 大小端转换_Python bin文件大小端转换