server

main函数

#include <stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<strings.h>
#include<arpa/inet.h>
#include<unistd.h>
#include<sys/select.h>
#include<sqlite3.h>
#include<string.h>
#include<stdlib.h>
#include <pthread.h>
#include"create_server.h"
#include"login.h"
#include"search.h"
int server_init(char *,unsigned short,int);
int login(int,fd_set);
int search(int);
void *thread_link(void *arg)
{int ret=0;int rws=*(int *)arg;ret=login(rws);if(ret==-1){close(rws);return NULL;}                                        //errorelse if(ret==1){close(rws);return NULL;}                                        //login quitelse if(ret==0){ret=search(rws);if(ret==-1){printf("search");close(rws);return NULL;}}                                        //login successclose(rws);pthread_exit(NULL);
}
int main(int argc, char *argv[])
{ int sockfd,ret;sockfd=server_init("192.168.2.41",7878,1024);if(sockfd==-1){printf("server_init error\n");return -1;}printf("server create success\n");int i;//等待连接
#define SIZE 1024char recvbuf[SIZE]={0},sendbuf[SIZE]={0};while(1){     struct sockaddr_in caddr;bzero(&caddr,sizeof(caddr));socklen_t clen=sizeof(caddr);int rws=accept(sockfd,(struct sockaddr *)&caddr,&clen);if(rws==-1){perror("accept");close(sockfd);return -1;}printf("some usr join in success\n");strcpy(sendbuf,"注册/登录/退出输入:0/1/quit");ret=send(rws,sendbuf,SIZE,0);if(ret==-1){perror("send");close(rws);break;}                                    //主线程接受连接pthread_t tid;if(0 != pthread_create(&tid,NULL,thread_link,(void *)&rws)){perror("pthread_create");break;}                                //创建子线程处理客户端请求pthread_detach(tid);}
close(sockfd);
return 0;
} 

create_server函数

#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<strings.h>
#include<arpa/inet.h>
#include<unistd.h>
#include"create_server.h"
int server_init(char *ipaddr,unsigned short port,int backlog)
{int ret,sockfd;sockfd=socket(AF_INET,SOCK_STREAM,0);if(sockfd==-1){perror("socket");return -1;}                        //创建网络套接字struct sockaddr_in saddr;bzero(&saddr,sizeof(saddr));saddr.sin_family=AF_INET;saddr.sin_port=htons(port);saddr.sin_addr.s_addr=(ipaddr==NULL)?htonl(INADDR_ANY):inet_addr(ipaddr);socklen_t slen=sizeof(saddr);ret=bind(sockfd,(struct sockaddr *)&saddr,slen);//绑定if(ret==-1){perror("bind");close(sockfd);return -1;}ret=listen(sockfd,backlog);        //监听if(ret==-1){perror("listen");close(sockfd);return -1;}return sockfd;
}

login 函数

#include <stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<strings.h>
#include<arpa/inet.h>
#include<unistd.h>
#include<sys/select.h>
#include<sqlite3.h>
#include<string.h>
#include"login.h"
#include"search.h"
int login(int i)
{
#define SIZE 1024int ret,flag,flag1,flag2,flag3,falg4,flag5,flag6,len;sqlite3 *db=NULL;ret = sqlite3_open("server.usr",&db);if(ret!=SQLITE_OK){printf("%s\n",sqlite3_errmsg(db));return -1;}char *errmsg = NULL;char **resultp;int nrow;int ncolumn;ret = sqlite3_get_table(db,"create table usr (name char [10],passwd char [10]);",&resultp,&nrow,&ncolumn,&errmsg);if(ret==-1){printf("sqlite3_get_table error\n");return -1;}        //建好用户信息表char recvbuf[SIZE]={0},sendbuf[SIZE]={0},namebuf[SIZE]={0},passwdbuf[SIZE]={0},buf[10]={0};
flag5:bzero(recvbuf,SIZE);ret=recv(i,recvbuf,SIZE,0);if(ret==-1){perror("recv");close(i);sqlite3_close(db);return -1;}if(recvbuf[0]=='0')//注册{
flag6:bzero(sendbuf,SIZE);strcpy(sendbuf,"请输入你的账号id 4~10个字符");ret=send(i,sendbuf,SIZE,0);if(ret==-1){perror("send");close(i);sqlite3_close(db);return -1;}bzero(recvbuf,SIZE);ret=recv(i,recvbuf,SIZE,0);if(ret==-1){perror("recv");close(i);sqlite3_close(db);return -1;}len=strlen(recvbuf);if(len<4||len>10){strcpy(sendbuf,"id长度不合适,请重新输入id");ret=send(i,sendbuf,SIZE,0);if(ret==-1){perror("send");close(i);sqlite3_close(db);return -1;}goto flag6;}else{strcpy(buf,recvbuf);sprintf(sendbuf,"select * from usr where name=\"%s\";",buf);if(SQLITE_OK!=sqlite3_get_table(db,sendbuf,&resultp,&nrow,&ncolumn,&errmsg)){printf("sqlite3_get_table:%s\n",errmsg);close(i);sqlite3_close(db);return -1;}if(nrow>0){strcpy(sendbuf,"id 重复 请重新注册!");ret=send(i,sendbuf,SIZE,0);if(ret==-1){perror("send");close(i);sqlite3_close(db);return -1;}goto flag6;}else{if(strcmp(recvbuf,"quit")==0)//usr want to quit really? {
flag :strcpy(sendbuf," 你的账号是:’quit‘,还是你想要退出?扣0/1");ret=send(i,sendbuf,SIZE,0);if(ret==-1){perror("send");close(i);sqlite3_close(db);return -1;}ret=recv(i,recvbuf,SIZE,0);if(ret==-1){perror("recv");close(i);sqlite3_close(db);return -1;}if(recvbuf[0]=='1'){close(i);return 1;}else if(recvbuf[0]=='0'){strcpy(namebuf,"quit");}else{strcpy(sendbuf,"无效字符,重新输入");ret=send(i,sendbuf,SIZE,0);if(ret==-1){perror("send");close(i);sqlite3_close(db);return -1;}goto flag;}}else{strcpy(namebuf,recvbuf);}
flag7:strcpy(sendbuf,"现在你可以设置你的密码,4~10个字符 !");ret=send(i,sendbuf,SIZE,0);if(ret==-1){perror("send");close(i);sqlite3_close(db);return -1;}ret=recv(i,recvbuf,SIZE,0);if(ret==-1){perror("recv");close(i);sqlite3_close(db);return -1;}len=strlen(recvbuf);if(len<4||len>10){strcpy(sendbuf,"密码长度不合适,请重新输入密码");ret=send(i,sendbuf,SIZE,0);if(ret==-1){perror("send");close(i);sqlite3_close(db);return -1;}goto flag7;}else{if(strcmp(recvbuf,"quit")==0)//判断用户密码是quit 还是想退出{
flag1:strcpy(sendbuf,"你的密码是‘quit’,还是你想要退出?扣0/1");ret=send(i,sendbuf,SIZE,0);\if(ret==-1){perror("send");close(i);sqlite3_close(db);return -1;}ret=recv(i,recvbuf,SIZE,0);if(ret==-1){perror("recv");close(i);sqlite3_close(db);return -1;}if(recvbuf[0]=='1')//退出{close(i);return 1;}else if(recvbuf[0]=='0')//密码四位是quit{strcpy(passwdbuf,"quit");}else {strcpy(sendbuf,"无效字符,重新输入:0/1\n");//没有输入0/1ret=send(i,sendbuf,SIZE,0);if(ret==-1){perror("send");close(i);sqlite3_close(db);return -1;}goto flag1;}}else {strcpy(passwdbuf,recvbuf);}//到此用户账号与密码保存在namebuf/passwdbuf中strcpy(recvbuf,"insert into usr values (\"");strcat(recvbuf,namebuf);strcpy(sendbuf,"\",\"");strcat(recvbuf,sendbuf);strcat(recvbuf,passwdbuf);strcpy(sendbuf,"\");");strcat(recvbuf,sendbuf);if(SQLITE_OK!=sqlite3_get_table(db,recvbuf,&resultp,&nrow,&ncolumn,&errmsg)){printf("sqlite_get_table:%s\n",errmsg);close(i);sqlite3_close(db);return -1;} //注册成功strcpy(sendbuf,"恭喜你,注册成功!你的账号信息如下 :");strcpy(his[i].name,namebuf);strcpy(his[i].pass,passwdbuf);ret=send(i,sendbuf,SIZE,0);if(ret==-1){perror("send");close(i);sqlite3_close(db);return -1;}ret=send(i,namebuf,SIZE,0);if(ret==-1){perror("send");close(i);sqlite3_close(db);return -1;}ret=send(i,passwdbuf,SIZE,0);if(ret==-1){perror("send");close(i);sqlite3_close(db);return -1;}//将信息发给客户端进行确认注册成功;}}}}else if(recvbuf[0]=='1')//登陆{
flag4 :strcpy(sendbuf,"请输入你的账号:");ret=send(i,sendbuf,SIZE,0);if(ret==-1){perror("send");close(i);sqlite3_close(db);return -1;}ret=recv(i,recvbuf,SIZE,0);if(ret==-1){perror("recv");close(i);sqlite3_close(db);return -1;}if(strcmp(recvbuf,"quit")==0){
flag2 :strcpy(sendbuf,"你的账号是‘quit’还是你想退出: 0/1");send(i,sendbuf,SIZE,0);if(ret==-1){perror("send");close(i);sqlite3_close(db);return -1;}recv(i,recvbuf,SIZE,0);if(ret==-1){perror("recv");close(i);sqlite3_close(db);return -1;}if(recvbuf[0]=='1'){close(i);return 1;}else if(recvbuf[0]=='0'){strcpy(namebuf,"quit");}else{strcpy(sendbuf,"无效字符,重新输入:0/1");send(i,sendbuf,SIZE,0);if(ret==-1){perror("send");close(i);sqlite3_close(db);return -1;}goto flag2;}}else {strcpy(namebuf,recvbuf);}strcpy(sendbuf,"输入你的密码:");send(i,sendbuf,SIZE,0);if(ret==-1){perror("send");close(i);sqlite3_close(db);return -1;}recv(i,recvbuf,SIZE,0);if(ret==-1){perror("recv");close(i);sqlite3_close(db);return -1;}if(strcmp(recvbuf,"quit")==0){
flag3:strcpy(sendbuf,"你的密码是‘quit’,还是你想退出:扣0/1");send(i,sendbuf,SIZE,0);if(ret==-1){perror("send");close(i);sqlite3_close(db);return -1;}recv(i,recvbuf,SIZE,0);if(ret==-1){perror("recv");close(i);sqlite3_close(db);return -1;}if(recvbuf[0]=='1'){close(i);return 1;}else if(recvbuf[0]=='0'){strcpy(passwdbuf,"quit");}else{strcpy(sendbuf,"无效字符,重新输入:0/1");send(i,sendbuf,SIZE,0);if(ret==-1){perror("send");close(i);sqlite3_close(db);return -1;}goto flag3;}}else{strcpy(passwdbuf,recvbuf);}//登陆信息存在namebuf/passwdbufstrcpy(recvbuf,"select * from usr where name=\"");strcat(recvbuf,namebuf);strcpy(sendbuf,"\"and passwd =\"");strcat(recvbuf,sendbuf);strcat(recvbuf,passwdbuf);strcpy(sendbuf,"\";");strcat(recvbuf,sendbuf);if(SQLITE_OK!=sqlite3_get_table(db,recvbuf,&resultp,&nrow,&ncolumn,&errmsg)){printf("sqlite3_get_table:%s\n",errmsg);close(i);sqlite3_close(db);return -1;}if(nrow<1){strcpy(sendbuf,"账户信息有误,请重新输入");send(i,sendbuf,SIZE,0);if(ret==-1){perror("send");close(i);sqlite3_close(db);return -1;}goto flag4;}strcpy(his[i].name,namebuf);strcpy(his[i].pass,passwdbuf);//log in success}else if(strcmp(recvbuf,"quit")==0){close(i);return 1;}else{strcpy(sendbuf,"请输入0/1来决定选项");ret=send(i,sendbuf,SIZE,0);if(ret==-1){perror("send");close(i);sqlite3_close(db);return -1;}goto flag5;}sqlite3_close(db);return 0;
}

search函数

#include <stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<unistd.h>
#include<sys/select.h>
#include<sqlite3.h>
#include<string.h>
#include<strings.h>
#include<time.h>
#include"search.h"
#define SIZE 1024
int search(int i)
{int ret,o,flag;char recvbuf[SIZE]={0},sendbuf[SIZE]={0},rowbuf[SIZE]={0};strcpy(sendbuf,"--------------登录成功----------------!");ret=send(i,sendbuf,SIZE,0);if(ret==-1){perror("send");close(i);return -1;}
flag:strcpy(sendbuf,"---------‘Q’退出---‘H‘历史------------");ret=send(i,sendbuf,SIZE,0);if(ret==-1){close(i);return -1;}strcpy(sendbuf,"---------------英英词典---------------");send(i,sendbuf,SIZE,0);if(ret==-1){close(i);return -1;}while(1){FILE *fp=fopen("dict.txt","r");if(fp==NULL){perror("fopen");return -1;}ret=recv(i,recvbuf,SIZE,0);if(ret==-1){perror("recv");close(i);return -1;}if(strcmp(recvbuf,"Q")==0){strcpy(sendbuf,"-----------BYE BYE !------------");ret=send(i,sendbuf,SIZE,0);if(ret==-1){close(i);return -1;}close(i);return 1;}else if(strcmp(recvbuf,"H")==0){strcpy(sendbuf,"-------------HISTORY-------------------");sleep(1);ret=send(i,sendbuf,SIZE,0);if(ret==-1){close(i);return -1;}for(int j=0;j<5;j++){sprintf(sendbuf,"TIME-----%s",his[i].time[j]);ret=send(i,sendbuf,SIZE,0);if(ret==-1){close(i);return -1;}sprintf(sendbuf,"WORD----%s",his[i].word[j]);ret=send(i,sendbuf,SIZE,0);if(ret==-1){close(i);return -1;}}goto flag;}else{sqlite3 *db=NULL;ret = sqlite3_open("server.usr",&db);if(ret!=SQLITE_OK){printf("%s\n",sqlite3_errmsg(db));return -1;}char *errmsg = NULL;char **resultp;int nrow=0;int ncolumn=0;recvbuf[strlen(recvbuf)]='\0';strcpy(sendbuf,"select * from dict where word=\"");strcat(sendbuf,recvbuf);strcat(sendbuf,"\";");ret=sqlite3_get_table(db,sendbuf,&resultp,&nrow,&ncolumn,&errmsg);if(ret!=SQLITE_OK){printf("sqlite_get_table:%s\n",errmsg);close(i);sqlite3_close(db);return -1;}if(nrow>0){strcpy(sendbuf,resultp[3]);time_t timep;struct tm *t;time(&timep);t=localtime(&timep);sprintf(rowbuf,"%02d:%02d:%02d",t->tm_hour,t->tm_min,t->tm_sec);strcpy(his[i].time[o],rowbuf);strcpy(his[i].word[o],recvbuf);o++;if(o==4){o=0;}}else{strcpy(sendbuf,"--------------未找到!--------------");}sleep(1);ret=send(i,sendbuf,SIZE,0);if(ret==-1){perror("send");return -1;}}}
}

头文件.H

create_server.h
#ifndef CREATE_SERVER_H
#define CREATE_SERVER_H
#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<strings.h>
#include<arpa/inet.h>
#include<unistd.h>
int server_init(char *,unsigned short,int);
#endif
--------------------------------------------------------------
login.h
#ifndef LOGIN_H
#define LOGIN_H
#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<strings.h>
#include<arpa/inet.h>
#include<unistd.h>
#include<sys/select.h>
#include<sqlite3.h>
#include<string.h>
#include"search.h"
int login(int);
#endif--------------------------------------------------------------search.h
#ifndef SEARCH_H
#define SEARCH_H
#include"login.h"
typedef struct
{char name[20];char pass[20];char time[5][20];char word[5][20];
}history;
history his[1024];
int search(int);
#define SIZE 1024
#endif

makefile

server_app:create_server.o login.o search.o main.o gcc create_server.o login.o search.o main.o -lsqlite3 -lpthread -o server_app
create_server.o:./create_server.cgcc -c create_server.c -I ./ -o create_server.o
login.o: ./login.cgcc -c login.c -I ./ -o login.o
search.o: ./search.cgcc -c search.c -I ./ -o search.o
main.o: ./main.cgcc -c main1.c -I ./ -o main.o
clean:rm *.o

user

client函数

#include <stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<strings.h>
#include<arpa/inet.h>
#include<unistd.h>
#include<sys/select.h>
#include<sqlite3.h>
#include<string.h>
#include<strings.h>int link_server(char *ipaddr,unsigned short port)
{int ret,sockfd;sockfd=socket(AF_INET,SOCK_STREAM,0);if(sockfd==-1){perror("socket");return -1;}struct sockaddr_in saddr;bzero(&saddr,sizeof(saddr));saddr.sin_family=AF_INET;saddr.sin_port=htons(port);saddr.sin_addr.s_addr=inet_addr(ipaddr);socklen_t slen=sizeof(saddr);ret=connect(sockfd,(struct sockaddr*)&saddr,slen);if(ret==-1){perror("connect");close(sockfd);return -1;}return sockfd;
}
int main()
{int ret,sockfd;sockfd=link_server("192.168.2.41",7878);if(sockfd==-1){printf("server error\n");return -1;}printf("-------------------------------------------\n");printf("|        ENG--ENG DIGTIONARY!!!           |\n");printf("|     /                         \\         |\n");printf("|    ||        广告位出租        ||       |\n");printf("|     \\                         /         |\n");printf("|      ----------WELCOME!--------         |\n");printf("-------------------------------------------\n");printf("------------------SCD----------------------\n");fd_set rfds,fds;FD_ZERO(&rfds);FD_SET(0,&rfds);FD_SET(sockfd,&rfds);int nfds=sockfd+1;
#define SIZE 1024char recvbuf[SIZE]={0},sendbuf[SIZE]={0};while(1){fds=rfds;ret=select(nfds,&fds,NULL,NULL,NULL);if(ret==-1){perror("select");close(sockfd);return -1;}if(FD_ISSET(0,&fds)){fgets(sendbuf,SIZE,stdin);sendbuf[strcspn(sendbuf,"\n")]='\0';ret=send(sockfd,sendbuf,SIZE,0);if(ret==-1){perror("send");close(sockfd);}}if (FD_ISSET(sockfd,&fds)){bzero(recvbuf,SIZE);ret=recv(sockfd,recvbuf,SIZE,0);if(ret==-1){perror("recv");close(sockfd);return -1;}if(ret==0){break;}printf("%s\n",recvbuf);}}return 0;
}

结果展示:

TCP实现英英词典(多线程)(项目设计)新手思维相关推荐

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

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

  2. [Silverlight]使用MVVM模式打造英汉词典

    最近比较关注MVVM(Model-View_ViewModel)模式,该模式十分适合WPF/Silverlight的开发.出于练习的目的打算使用Silverlight做个英汉词典(可能是由于近来疯狂的 ...

  3. c语言程序报告英汉词典,C语言电子英汉词典程序设计报告-自动化1203-李煜明.docx...

    C语言电子英汉词典程序设计报告-自动化1203-李煜明 课 程 设 计 报 告课程名称 C语言课程设计 课题名称 电子英汉词典 专 业 自动化 班 级 1203 学 号 201201020304 姓 ...

  4. 【小型JavaFx项目】英汉词典

    英汉词典 简介 知识点简介 效果图 源代码 Word.java DictionaryFunction.java DictionaryFrame.java 简介 花了1个多小时帮数媒的同学用以前的项目改 ...

  5. 英伟达 Jetson Nano 新手必备:使用CSI或USB摄像头拍摄第一张照片

    英伟达 Jetson Nano 新手必备:使用CSI或USB摄像头拍摄第一张照片 1. 引言 1.1 支持的摄像头 1.2 nvgstcapture 2. 在屏幕上开始捕获和预览显示 2.1 CSI摄 ...

  6. 常用在线英汉、英英词典

    英汉词典站点: Dict.CN: http://dict.cn/        百度词典: http://dict.baidu.com/ 英英词典站点: TheFreeDictionary: http ...

  7. APP Designer 制作简易英汉词典的回调函数书写

    APP Designer 制作简易英汉词典的回调函数书写 在学习MATLAB 的App Designer 时看到的一个有意思的小项目,主要步骤参考了slandarer 的MATLAB 手把手带你制作第 ...

  8. 英酷词典 使用方法 必知必会

    测试版下载 本文会介绍关于英酷词典的如下三方面内容: 怎么获得极致体验? 制作单词表并导入Anki 词典管理 怎么获得极致体验? 虽然[英酷词典](https://www.cnblogs.com/iM ...

  9. 电子英汉词典c语言程序设计报告,英汉电子词典设计报告_设计_C语言_C语言程序设计.doc...

    英汉电子词典设计报告_设计_C语言_C语言程序设计 课程设计 课程名称 :C语言程序课程设计 题目名称 :电子英汉词典 学生学院 :电气信息学院 专业班级 :自动化1101 学 号 :20110102 ...

  10. 英汉词典mysql_构建英汉词典数据库 java

    读入文本形式的牛津英汉词典文件InputDictionary.txt,将其存为规范的文本格式文件OutputDictionary.txt,字段之间以\t分隔希望能给出个具体的程序,不要提示.谢谢了In ...

最新文章

  1. 读取数据库信息构建视图字段的备注信息,方便程序代码生成
  2. 介绍自己以及github注册流程
  3. java基础面试题之:String 类的常用方法都有那些?
  4. HDU1425 sort【排序】
  5. pythonATM,购物车项目实战_补充9文档说明
  6. AMESim中Demo简介
  7. 高等数学—常见三角函数
  8. redis的消息发布(publish)/ 订阅(subscribe)
  9. 白天黑夜模式切换引起的activity销毁重启
  10. 帮你混迹职场风生水起的八大定律
  11. 【应急类漏洞】Linux下变种DDG挖矿病毒紧急通告及处置方法
  12. androidsettitle方法_在Android应用程序中,Toolbar.setTitle方法无效 - 应用程序名称显示为ti...
  13. Python global 全局变量,多文件,跨文件使用
  14. Mysql语句(二)
  15. 三维模型(X,Y,Z)坐标,UV坐标
  16. webpack常见面试题
  17. C# DGV常用操作
  18. cpolar:一款好用的内网穿透工具 - 无需公网IP
  19. 《基于微信小程序的美食推荐系统》硕士论文
  20. 博途软件中多重背景块的建立_TIA博途软件中创建多重背景函数块

热门文章

  1. 填坑日常之 EDAC DIMM CE Error
  2. Android --- 手游项目中聊天表情的处理(一)
  3. SEO(搜索引擎优化)关于关键词的知识分享
  4. Jmeter日常使用几个小技巧
  5. 盐城北大青鸟:用心培养,静待花开
  6. makefile中make fpdve问题
  7. AI算法工程师的寒冬?我们完全可以反向思维。。。
  8. 2022 极术通讯-计算机体系结构将何去何从?
  9. ad域下发策略,在 Azure AD 域服务中创建和管理组策略 | Microsoft Docs
  10. Python实训题目