10.5作业

news2024/7/6 19:32:12

磕磕绊绊还是差不多完成了,tcp多客户端在线词典

代码:

数据库导入:有点粗糙,不知道怎么搞成两列,一个单词中间还是空格卧槽难搞

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sqlite3.h>
#define ERR_MSG(msg) do{\
	fprintf(stderr,"__%d__",__LINE__);\
	perror(msg);\
}while(0)
int main(int argc, const char *argv[])
{
	//词典数据库初始化
	sqlite3 *ppDb;
	if(sqlite3_open("../ele_directory.db",&ppDb)!=0){
		printf("__%d__:sqlite3_open error\n",__LINE__);
		return -1;
	}
	
	char sql[128]="create table if not exists directory (word char);";
	char *errmsg="";

	int sql_res=sqlite3_exec(ppDb,sql,NULL,NULL,&errmsg);
	if(sql_res!=0){
		printf("__%d__:sqlite3_exec :%s\n",__LINE__,errmsg);
		return -1;
	}
	//导入数据
	FILE* fp=fopen("../dict.txt","r");
	if(NULL==fp){
		ERR_MSG("fopen");
		return -1;
	}
	while(1){
		char line[64]="";
		bzero(line,sizeof(line));
		char* fs_res=fgets(line,sizeof(line),fp);
		if(NULL==fs_res){
			puts("文件读取完毕");
			break;
		}
		bzero(sql,sizeof(sql));

		sprintf(sql,"insert into directory values(\"%s\");",line);
		sql_res=sqlite3_exec(ppDb,sql,NULL,NULL,&errmsg);
		printf("%s\n",sql);
		if(sql_res!=0){
			printf("__%d__:sqlite3_exec:%s\n",__LINE__,errmsg);
			return -1;
		}
	}
	puts("数据导入完成");
	

	if(sqlite3_close(ppDb)!=0){
		printf("__%d__:sqlite3_close error\n",__LINE__);
		return -1;
	}

	return 0;
}

服务器:

server.c

/*
 * function:    在线词典服务器TCP多线程
 * @param [ in] 
 * @param [out] 
 * @return      
 */
#include "head.h"


int main(int argc, const char *argv[])
{


	//TCP服务器创建
	int sfd=socket(AF_INET,SOCK_STREAM,0);
	if(sfd<0){
		ERR_MSG("socket");
		return -1;
	}
	//允许端口快速复用
	int reuse = 1;
	if(setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) < 0)
	{
		ERR_MSG("setsockopt");
		return -1;
	}
	printf("允许端口快速复用成功\n");

	struct sockaddr_in addr;
	addr.sin_family=AF_INET;
	addr.sin_port=htons(PORT);
	addr.sin_addr.s_addr=inet_addr(IP);
	if(bind(sfd,(struct sockaddr*)&addr,sizeof(addr))<0){
		ERR_MSG("bind");
		return -1;
	}
	printf("绑定成功\n");
	if(listen(sfd,128)<0){
		ERR_MSG("listen");
		return -1;
	}
	printf("监听状态\n");
	struct sockaddr_in cli_addr;
	socklen_t addrlen=sizeof(cli_addr);
	pthread_t pth;

	
	while(1){
		printf("客户端:%s:%d:连接前\n",\
				inet_ntoa(cli_addr.sin_addr),\
				ntohs(cli_addr.sin_addr.s_addr));
		int cfd=accept(sfd,(struct sockaddr*)&cli_addr,&addrlen);
		if(cfd<0){
			ERR_MSG("accept");
			return -1;
		}
		printf("客户端:%s:%d:连接成功\n",\
				inet_ntoa(cli_addr.sin_addr),\
				ntohs(cli_addr.sin_port));
		//调用线程
		cli_info client;	
		client.cfd=cfd;
		client.cli_addr=cli_addr;
		if(pthread_create(&pth,NULL,fun,(void*)&client)<0){
			ERR_MSG("pthread_create");
			return -1;
		}
		printf("[%d]线程创建成功\n",cfd);
		pthread_detach(pth);//分离线程交由系统回收
		
	}
	close(sfd);
	return 0;
}

fun.c

#include "head.h"


void * fun(void*arg){
	int cfd=((cli_info*)arg)->cfd;
	struct sockaddr_in cli_addr=((cli_info*)arg)->cli_addr;
	char buf[128]="";
	char user[16]="";
	//打开数据库
	sqlite3 *ppDb;
	if(sqlite3_open("../ele_directory.db",&ppDb)!=0){
		printf("__%d__:sqlite3_open error\n",__LINE__);
		return NULL;
	}
	//第一层
	//登录判断,(注册判断)1代表登录,2代表注册
	socklen_t addrlen=sizeof(cli_addr);	

	int recv_res=recv(cfd,&buf,sizeof(buf),0);
	if(recv_res<0){
		ERR_MSG("recv");
		return NULL;
	}
	if(recv_res==0){
		printf("客户端:%s:%d:断开连接\n",\
					inet_ntoa(cli_addr.sin_addr),\
					ntohs(cli_addr.sin_port));
		return NULL;
	}
	printf("11111=%s\n",buf);
	if(buf[0]=='1'){
		//登录判断
		printf("login...\n");
		int login_res;
		while(login_res=isLogin(ppDb,cfd,&user)){
			printf("login_res=%d\n",login_res);
			char*l_res=NULL;
			if(1==login_res)
				l_res="1";
			else if(2==login_res)
				l_res="2";
			else if(3==login_res) 
				l_res="3";
			else
				return NULL;
			printf("l_res=%s\n",l_res);
			int send_res=send(cfd,l_res,sizeof(recv_res),0);
			if(send<0){
				ERR_MSG("send");
				return NULL;
			}
		}
		int send_res=send(cfd,"0",1,0);
			if(send<0){
				ERR_MSG("send");
				return NULL;
			}
		printf("%s登陆成功\n",user);
	}else if(buf[0]=='2'){
		//注册判断
		printf("register...\n");
		int register_res;
		while(register_res=isRegister(ppDb,cfd,&user)){
			printf("register_res=%d",register_res);
			if(register_res!=1)
				return NULL;
		}
		printf("%s注册成功\n",user);
		return NULL;
	}else{
		printf("__%d__unknown error\n",__LINE__);
		return NULL;
	}
	//第二层
	//单词查询或者记录查询或退出
	while(1){
		char sql[128]="";
		char* errmsg=NULL;
		bzero(buf,sizeof(buf));
		recv_res=recv(cfd,&buf,sizeof(buf),0);
		if(recv_res<0){
			ERR_MSG("recv");
			return NULL;
		}
		if(recv_res==0){
			printf("客户端:%s:%d:断开连接\n",\
					inet_ntoa(cli_addr.sin_addr),\
					ntohs(cli_addr.sin_port));
		//账号状态设为未登录
		bzero(sql,sizeof(sql));
		sprintf(sql,"update account set status=\"1\" where account=\"%s\";",user);
		if(sqlite3_exec(ppDb,sql,NULL,NULL,&errmsg)!=0){
			fprintf(stderr, "sqlite3_exec: %s __%d__\n", errmsg, __LINE__);
			return NULL;
		}
		}
		if(buf[0]=='3'){
			//单词查询
			printf("word finding...\n");
			findWord(ppDb,cfd,user);	
		}else if(buf[0]=='4'){
			//记录查询
			printf("record finding...\n");
			findRecord(ppDb,cfd,user);
		}else if(buf[0]=='5'){
			printf("客户端:%s:退出登录\n",user);
		//账号状态设为未登录
		bzero(sql,sizeof(sql));
		sprintf(sql,"update account set status=\"1\" where account=\"%s\";",user);
		if(sqlite3_exec(ppDb,sql,NULL,NULL,&errmsg)!=0){
			fprintf(stderr, "sqlite3_exec: %s __%d__\n", errmsg, __LINE__);
			return NULL;
		}

		return NULL;

		}else{
			printf("__%d__unknown error\n",__LINE__);
			return NULL;
		}

	}

	//关闭数据库
	if(sqlite3_close(ppDb)!=0){
		printf("__%d__:sqlite3_close error\n",__LINE__);
		return NULL;
	}

}
int isLogin(sqlite3 *ppDb,int cfd,char (*user)[]){
	char account[10]="";
	char password[10]="";
	char buf[128]="";
	//数据库查询,账号是否存在,若存在密码是否正确
	int recv_res=recv(cfd,&buf,sizeof(buf),0);
	if(recv_res<0){
		ERR_MSG("recv");
		return -1;
	}else if(recv_res==0){
		printf("客户端:%s:断开连接\n",*user);
		return -1;

	}
	printf("buf=%s\n",buf);
	sscanf(buf,"%s %s",account,password);
	
	char sql[128]="";
	char** pres = NULL;
    int row, column;
    char* errmsg = NULL;
	
	sprintf(sql,"select * from account where account=\"%s\";",account);
	if(sqlite3_get_table(ppDb,sql,&pres,&row,&column,&errmsg)!=0){
		fprintf(stderr, "sqlite3_get_table: %s __%d__\n", errmsg, __LINE__);
        return -1;
	}
	printf("sql=%s\n",sql);
	int exist_res=0;//是否存在

	for (int i=0; i<(row+1)*column; i++)
	{
		printf("%s\t", pres[i]);
        if((i+1)%column == 0)
            putchar('\n');
		exist_res=1;//存在为1
	}
	printf("exist_res=%d\n",exist_res);
	if(0==exist_res){
		printf("账号不存在\n");	
		return 1;//账号不存在返回1
	}else{
		printf("账号存在,判断密码\n");
		bzero(sql,sizeof(sql));
		sprintf(sql,"select status from account where account=\"%s\" and password=\"%s\";",account,password);

		if(sqlite3_get_table(ppDb,sql,&pres,&row,&column,&errmsg)!=0){
			fprintf(stderr, "sqlite3_get_table: %s __%d__\n", errmsg, __LINE__);
			return -1;
		}
		printf("sql=%s\n",sql);
		int login_res=0;//是否存在账号密码匹配

		for (int i=column; i<(row+1)*column; i++)
		{
			printf("%s\t", pres[i]);
			if((i+1)%column == 0)
				putchar('\n');
			login_res=1;//存在为1
		}
		if(0==login_res){
			printf("密码错误\n");
			return 2;//账号密码错误返回2
		}else if(0==strcmp(pres[column],"0")){
			printf("账号重复登录\n");
			return 3;
		}
		//账号状态设为已登录
		bzero(sql,sizeof(sql));
		sprintf(sql,"update account set status=\"0\" where account=\"%s\";",account);
		if(sqlite3_exec(ppDb,sql,NULL,NULL,&errmsg)!=0){
			fprintf(stderr, "sqlite3_exec: %s __%d__\n", errmsg, __LINE__);
			return -1;
		}

		printf("密码正确\n");
		strcpy(*user,account);
		return 0;//登陆成功返回0
	}
}
int isRegister(sqlite3 *ppDb,int cfd,char(*user)[]){
	char account[10]="";
	char password[10]="";
	char buf[128]="";
	//数据库查询,账号是否存在
	bzero(buf,sizeof(buf));
	int recv_res=recv(cfd,&buf,sizeof(buf),0);
	if(recv_res<0){
		ERR_MSG("recv");
		return -1;
	}else if(recv_res==0){
		printf("客户端:%s:断开连接\n",*user);
			return -1;

	}


	printf("buf=%s\n",buf);
	sscanf(buf,"%s %s",account,password);
	
	char sql[128]="";
	char** pres = NULL;
    int row, column;
    char* errmsg = NULL;

	sprintf(sql,"select * from account where account=\"%s\";",account);
	if(sqlite3_get_table(ppDb,sql,&pres,&row,&column,&errmsg)!=0){
		fprintf(stderr, "sqlite3_get_table: %s __%d__\n", errmsg, __LINE__);
        return -1;
	}
	printf("sql=%s\n",sql);
	int reg_res=0;//是否存在

	for (int i=0; i<(row+1)*column; i++)
	{
		printf("%s\t", pres[i]);
        if((i+1)%column == 0)
            putchar('\n');
		reg_res=1;//存在为1
	}
	printf("reg_res=%d\n",reg_res);
	if(0==reg_res){
		//不存在
		printf("账号不存在,开始注册:\n");	
		bzero(sql,sizeof(sql));
		sprintf(sql,"insert into account values (\"%s\",\"%s\",\"1\");",account,password);
		printf("sql=%s\n",sql);
		if(sqlite3_exec(ppDb,sql,NULL,NULL,&errmsg)!=0){
			fprintf(stderr, "sqlite3_get_table: %s __%d__\n", errmsg, __LINE__);
        	return -1;
		}
		printf("注册完成\n");
		strcpy(*user,account);
		char *r_res="0";//注册成功
		printf("r_res=%s\n",r_res);	
		int send_res=send(cfd,r_res,sizeof(recv_res),0);
		if(send<0){
			ERR_MSG("send");
			return -1;
		}

		return 0;
	}else{
		printf("账号已存在\n");
		char *r_res="1";
		printf("r_res=%s\n",r_res);	
		int send_res=send(cfd,r_res,sizeof(recv_res),0);
		if(send<0){
			ERR_MSG("send");
			return -1;
		}
		return 1;
	}

}
int findWord(sqlite3 *ppDb,int cfd,char*user){
	printf("user=%s\n",user);
	char buf[128]="";
	char word[32]="";
	char sql[128]="";
	char*errmsg=NULL;
	int recv_res=recv(cfd,&word,sizeof(buf),0);
	if(recv_res<0){
		ERR_MSG("recv");
		return -1;
	}
	if(recv_res==0){
			printf("客户端:%s:断开连接\n",user);
		//账号状态设为未登录
		sprintf(sql,"update account set status=\"1\" where account=\"%s\";",user);
		if(sqlite3_exec(ppDb,sql,NULL,NULL,&errmsg)!=0){
			fprintf(stderr, "sqlite3_exec: %s __%d__\n", errmsg, __LINE__);
			return -1;
		}
	}
	printf("word=%s\n",word);
	char** pres = NULL;
    int row, column;
	bzero(sql,sizeof(sql));
	sprintf(sql,"select * from directory where word like \"%s%\";",word);
	if(sqlite3_get_table(ppDb,sql,&pres,&row,&column,&errmsg)!=0){
		fprintf(stderr, "sqlite3_get_table: %s __%d__\n", errmsg, __LINE__);
        return -1;
	}
	printf("sql=%s\n",sql);
	for (int i=column; i<(row+1)*column; i++)
	{
		bzero(buf,sizeof(buf));

		printf("%s\t", pres[i]);
		strcpy(buf,pres[i]);
		strcat(buf," ");
        if((i+1)%column == 0)
            strcat(buf,"\n");
		printf("buf=%s\n",buf);
		int send_res=send(cfd,buf,sizeof(buf),0);
		if(send<0){
		ERR_MSG("send");
		return -1;
		}
	
        if((i+1)%column == 0)
            putchar('\n');
	}
	int send_res=send(cfd,"find over",strlen("find over"),0);
		if(send<0){
		ERR_MSG("send");
		return -1;
		}
	printf("查找完毕\n");
	//记录(word,time,user)
	bzero(sql,sizeof(sql));
	time_t t=time(NULL);
	struct tm *timeinfo=localtime(&t);
	char r_time[64]="";
	sprintf(r_time,"%d-%d-%d:%d:%d:%d",\
			timeinfo->tm_year+1900,timeinfo->tm_mon+1,timeinfo->tm_mday,\
			timeinfo->tm_hour,timeinfo->tm_min,timeinfo->tm_sec);
	printf("word:%s;time:%s;user:%s\n",word,r_time,user);
	printf("sql=%s\n",sql);
	sprintf(sql,"insert into record values(\"%s\",\"%s\",\"%s\");",word,r_time,user);
	printf("sql=%s\n",sql);
	
	if(sqlite3_exec(ppDb,sql,NULL,NULL,&errmsg)!=0){
		fprintf(stderr, "sqlite3_get_table: %s __%d__\n", errmsg, __LINE__);
		return -1;
	}
	
	printf("记录完成\n");
	return 0;
}
int findRecord(sqlite3 *ppDb,int cfd,char*user){
	printf("user=%s\n",user);
	char sql[128]="";
	char** pres = NULL;
    int row, column;
    char* errmsg = NULL;
	char buf[128]="";

	sprintf(sql,"select * from record where user=\"%s\";",user);
	if(sqlite3_get_table(ppDb,sql,&pres,&row,&column,&errmsg)!=0){
		fprintf(stderr, "sqlite3_get_table: %s __%d__\n", errmsg, __LINE__);
        return -1;
	}
	printf("sql=%s\n",sql);
	for (int i=column; i<(row+1)*column; i++)
	{
		bzero(buf,sizeof(buf));
		printf("%s;%ld\t", pres[i],strlen(pres[i]));
		strcpy(buf,pres[i]);
		strcat(buf," ");
		if((i+1)%column == 0)
            strcat(buf,"\n");

		int send_res=send(cfd,buf,sizeof(buf),0);
		if(send<0){
		ERR_MSG("send");
		return -1;
		}
	
        if((i+1)%column == 0)
            putchar('\n');
	}
	printf("查找完毕\n");
	int send_res=send(cfd,"find record over",strlen("find record over"),0);
		if(send<0){
		ERR_MSG("send");
		return -1;
		}
	printf("记录查找完毕\n");
	return 0;
}

head.h

#ifndef __HEAD_H__
#define __HEAD_H__

#define ERR_MSG(msg) do{\
	fprintf(stderr,"__%d__",__LINE__);\
	perror(msg);\
}while(0)
#define PORT 8888
#define IP "192.168.1.6"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>  
#include <sys/socket.h>
#include <arpa/inet.h>
#include <pthread.h>
#include <unistd.h>
#include <sqlite3.h>
#include <time.h>

typedef struct clientInfo{
	int cfd;
	struct sockaddr_in cli_addr;
}cli_info;

void * fun(void*arg);
int isLogin(sqlite3 *ppDb,int cfd,char(*user)[]);
int isRegister(sqlite3 *ppDb,int cfd,char(*user)[]);
int findWord(sqlite3 *ppDb,int cfd,char*user);
int findRecord(sqlite3 *ppDb,int cfd,char*user);
#endif

客户端:

client.c

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>

//自定义报错提示
#define ERR_MSG(msg) do{\
	fprintf(stderr,"__%d__",__LINE__);\
	perror(msg);\
}while(0)
#define SER_PORT 8888
#define SER_IP "192.168.1.6"
/*
 * function:    TCP客户端
 * @param [ in] 
 * @param [out] 
 * @return      
 */
int login(int cfd);
int registe(int cfd);
int findWord(int cfd);
int findRecord(int cfd);

int main(int argc, const char *argv[])
{
	//1.创建socket套接字,
	int cfd=socket(AF_INET,SOCK_STREAM,0);
	if(cfd<0){
		ERR_MSG("socket");
		return -1;
	}
	puts("socket create");

	//允许端口快速复用
	int reuse = 1;
	if(setsockopt(cfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) < 0)
	{
		ERR_MSG("setsockopt");
		return -1;
	}
	printf("允许端口快速复用成功\n");

	//2.连接服务端connect
	struct sockaddr_in addr;
	addr.sin_family=AF_INET;
	addr.sin_port=htons(SER_PORT);
	addr.sin_addr.s_addr=inet_addr(SER_IP);
	if(connect(cfd,(struct sockaddr*)&addr,sizeof(addr))<0){
		ERR_MSG("connect");
		return -1;
	}
	puts("connect success");
	printf("-------------------------------------------------\n");
	printf("-------Wecome to eletronic directory system------\n");
	printf("-------------------------------------------------\n");
	printf("--------------1.登录-----------------------------\n");
	printf("--------------2.注册-----------------------------\n");
	printf("--------------3.退出-----------------------------\n");
	printf("-------------------------------------------------\n");
	printf("-------------------------------------------------\n");
	printf("-------------------------------------------------\n");
	char choice=0;
	while(1){

		printf("请选择1.登录;2注册;3.退出>>>");
		choice=getchar();
		while(getchar()!='\n');
		switch(choice){
		case '1':
			//登录
			if(5==login(cfd))
				return 0;
			break;
		case '2':
			//注册
			if(0==registe(cfd))

				return 0;
		case '3':
			//退出
			return 0;
		default :
			printf("错误输入,请重输\n");
			break;	
		}

	}
	close(cfd);
	return 0;
}
int login(int cfd){
	char buf[32]="";
	char status=0;
	int send_res=send(cfd,"1",1,0);
	if(send_res<0){
		ERR_MSG("send");
		return -1;
	}
	while(1){
		
		printf("请输入账号 密码 (空格分开)>>>");
		fgets(buf,sizeof(buf),stdin);

		int send_res=send(cfd,buf,sizeof(buf),0);
		if(send_res<0){
			ERR_MSG("send");
			return -1;
		}
		int recv_res=recv(cfd,&status,sizeof(buf),0);
		if(recv_res<0){
			ERR_MSG("recv");
			return -1;
		}else if(recv_res==0){
			printf("socket peer has shutdown\n");
			return -2;
		}
		printf("status=%c\n",status);
		if('1'==status){
			printf("账号不存在\n");
		}else if('2'==status){
			printf("密码错误\n");
		}else if('3'==status){
			printf("账号已登录\n");
		}else{
		printf("登陆成功\n");
		break;}
	}
	printf("-----------------------------------\n");
	printf("-------请输入你的操作--------------\n");
	printf("---------3.查找单词----------------\n");
	printf("---------4.记录查询----------------\n");
	printf("---------5.退出--------------------\n");
	printf("-----------------------------------\n");
	char choice=0;
	while(1){

		printf("请选择>>>3.查找单词4.记录查询5.退出");
		choice=getchar();
		while(getchar()!='\n');
		switch(choice){
		case '3':
			//查找单词
			findWord(cfd);
			break;
		case '4':
			//查询记录
			findRecord(cfd);
			break;
		case '5':
			//退出
			send_res=send(cfd,"5",1,0);
			if(send_res<0){
				ERR_MSG("send");
				return -1;
			}
			return 5;
		default :
			printf("错误输入,请重输\n");
			break;	
		}

	}

	return 0;
}
int registe(int cfd){
	char buf[32]="";
	char status=0;
	int send_res=send(cfd,"2",1,0);
	if(send_res<0){
		ERR_MSG("send");
		return -1;
	}
	while(1){
		bzero(buf,sizeof(buf));
		printf("请输入账号 密码 (空格分开)>>>");

		fgets(buf,sizeof(buf),stdin);
		printf("%s",buf);
		int send_res=send(cfd,buf,sizeof(buf),0);
		if(send_res<0){
			ERR_MSG("send");
			return -1;
		}
		int recv_res=recv(cfd,&status,sizeof(buf),0);

		if(recv_res<0){
			ERR_MSG("recv");
			return -1;
		}else if(recv_res==0){
			printf("socket peer has shutdown\n");
			return -2;
		}
		printf("status=%c\n",status);
		if(status=='0'){
			printf("注册成功,请重新进入系统\n");
			return 0;
		}else if(status=='1'){
			printf("账号已存在\n");
		}
	}
}
int findWord(int cfd){
	char buf[128]="";
	int send_res=send(cfd,"3",1,0);
	if(send_res<0){
		ERR_MSG("send");
		return -1;
	}
	printf("请输入你要查询的单词(支持模糊查询)>>>");
	fgets(buf,sizeof(buf),stdin);
	printf("%s",buf);
	buf[strlen(buf)-1] = '\0';
	send_res=send(cfd,buf,sizeof(buf),0);
	if(send_res<0){
		ERR_MSG("send");
		return -1;
	}
	while(1){

		bzero(buf,sizeof(buf));
		int recv_res=recv(cfd,buf,sizeof(buf),0);

		if(recv_res<0){
			ERR_MSG("recv");
			return -1;
		}else if(recv_res==0){
			printf("socket peer has shutdown\n");
	return -2;
		}
		if(0==strcmp(buf,"find over"))
			break;

		printf("%s\n",buf);
	}
	putchar(10);
	printf("查找单词完毕\n");
	return 0;
}
int findRecord(int cfd){
	char buf[128]="";
	int send_res=send(cfd,"4",1,0);
	if(send_res<0){
		ERR_MSG("send");
		return -1;
	}
	while(1){
		bzero(buf,sizeof(buf));
		int recv_res=recv(cfd,buf,sizeof(buf),0);

		if(recv_res<0){
			ERR_MSG("recv");
			return -1;
		}else if(recv_res==0){
			printf("socket peer has shutdown\n");
			return -2;
		}
		if(0==strcmp(buf,"find record over"))
			break;
	
		printf("%s",buf);
	}
	putchar(10);
	printf("查找记录完毕\n");
	return 0;
}

又是依托屎山代码,好乱,不想去整理了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1060589.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

NPDP产品经理知识(产品创新流程)

1.复习组合管理: 组合管理的目标 ===> 价值最大化,项目平衡,战略一致,管道平衡(资源需求和供给),盈利充分 (实现财务目标) 产品创新流程就是管理风险的过程。 模糊前端: 产品创新章程:PIC 包含 =====> 背景,聚焦舞台,目标和目的,特别准则,可持续性 新产…

mysql面试题13:MySQL中什么是异步复制?底层实现?

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:讲一讲mysql中什么是异步复制?底层实现? MySQL中的异步复制(Asynchronous Replication)是一种复制模式,主服务器将数据写入二进制日志后,无…

计组——I/O方式

一、程序查询方式 CPU不断轮询检查I/O控制器中“状态寄存器”&#xff0c;检测到状态为“已完成”之后&#xff0c;再从数据寄存器取出输入数据。 过程&#xff1a; 1.CPU执行初始化程序&#xff0c;并预置传送参数&#xff1b;设置计数器、设置数据首地址。 2. 向I/O接口发…

星际争霸之小霸王之小蜜蜂(十六)--狂奔的花猫

系列文章目录 星际争霸之小霸王之小蜜蜂&#xff08;十五&#xff09;--剧将终场 星际争霸之小霸王之小蜜蜂&#xff08;十四&#xff09;--资本家的眼泪 星际争霸之小霸王之小蜜蜂&#xff08;十三&#xff09;--接着奏乐接着舞 星际争霸之小霸王之小蜜蜂&#xff08;十二…

视频讲解|含可再生能源的热电联供型微网经济运行优化(含确定性和源荷随机两部分代码)

1 主要内容 该视频为《含可再生能源的热电联供型微网经济运行优化》代码讲解内容&#xff0c;对应的资源下载链接为考虑源荷不确定性的热电联供微网优化-王锐matlab&#xff08;含视频讲解&#xff09;&#xff0c;对该程序进行了详尽的讲解&#xff0c;基本做到句句分析和讲解…

路径问题【动态规划】

一、不同路径 class Solution { public:int uniquePaths(int m, int n) {vector<vector<int>> dp(m1,vector<int>(n1));dp[0][1] 1;for(int i 1;i < m;i){for(int j 1;j < n;j){dp[i][j] dp[i-1][j]dp[i][j-1];}}return dp[m][n];} }; 二、不同路…

三、thymeleaf基本语法

3.1、基本语法 3.1.1变量表达式&#xff1a;${...} 变量表达式用于在页面中输出指定的内容&#xff0c;此内容可以是变量&#xff0c;可以是集合的元素&#xff0c;也可以是对象的属性。主要用于填充标签的属性值&#xff0c;标签内的文本&#xff0c;以及页面中js变量的值等…

OpenCV项目开发实战--CUDA 模块使用详细介绍--附完整代码

如果您已经使用 OpenCV 一段时间,您应该已经注意到,在大多数情况下 OpenCV 使用 CPU,这并不总能保证您获得所需的性能。为了解决这个问题,2010 年 OpenCV 中添加了一个使用 CUDA 提供 GPU 加速的新模块。您可以在下面找到展示 GPU 模块优势的基准测试: 图 1: CPU 上的 Op…

Day-06 基于 Docker安装 Nginx 镜像

1.去官方公有仓库查询nginx镜像 docker search nginx 2.拉取该镜像 docker pull nginx 3. 启动镜像&#xff0c;使用nginx服务&#xff0c;代理本机8080端口(测试是不是好使) docker run -d -p 8080:80 --name nginx-8080 nginx docker ps curl 127.0.0.1:8080

黑马程序员 MySQL数据库入门到精通——进阶篇(2)

黑马程序员 MySQL数据库入门到精通——进阶篇&#xff08;2&#xff09; 1. SQL优化1.1 插入数据1.2 主键优化1.3 order by优化1.4 group by优化1.5 limit优化1.6 count优化1.7 update优化 2. 视图2.1 视图-介绍及基本语法2.2 视图-检查选项(cascaded)2.3 视图-检查选项(local)…

SQL Server不允许保存更改的解决方法

SQL Server不允许保存更改的解决方法

深信服SG上网优化管理系统存在任意文件读取漏洞 附POC

文章目录 深信服SG上网优化管理系统存在任意文件读取漏洞 附POC1. 深信服SG上网优化管理系统简介2.漏洞描述3.影响版本4.fofa查询语句5.漏洞复现6.POC&EXP7.整改意见8.往期回顾 深信服SG上网优化管理系统存在任意文件读取漏洞 附POC 免责声明&#xff1a;请勿利用文章内的…

软件设计师_计算机网络_学习笔记

文章目录 4.1 网路技术标准与协议4.1.1 协议4.1.2 DHCP4.1.3 DNS的两种查询方式 4.2 计算机网络的分类4.2.1 拓扑结构 4.3 网络规划与设计4.3.1 遵循的原则4.3.2 逻辑网络设计4.3.3 物理网络设计4.3.4 分层设计 4.4 IP地址与子网划分4.4.1 子网划分4.4.2 特殊IP 4.5 HTML4.6 无…

C++入门-day01

一、认识C C融合了三种不同的编程方式 C代表的过程性语言在C基础上添加的类、结构体puls代表的面向对象语言C模板支持泛型编程 C完全兼容C的特性 Tips&#xff1a;侯捷老师提倡的Modren C是指C11、C14、C17和C20这些新标准所引入的一系列新特性和改进。在我们练习的时候也应当去…

QT实现TCP服务器客户端的实现

ser&#xff1a; widget.cpp&#xff1a; #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);//实例化一个服务器server new QTcpServer(this);// 此时&#xf…

MyBatisPlus(八)范围查询

说明 范围查询&#xff0c;包括&#xff1a; 大于大于等于小于小于等于在范围内在范围外 大于&#xff1a;gt 代码 Testvoid gt() {LambdaQueryWrapper<User> wrapper new LambdaQueryWrapper<>();wrapper.gt(User::getAge, 20);List<User> users mapp…

Netty 4.1.98.Final 发布

Netty 4.1.98 稳定版已发布。Netty 是一个异步事件驱动的网络应用框架&#xff0c;主要用于可维护的高性能协议服务器和客户端的快速开发。 此版本还原了上一版本中所做的更改&#xff0c;这些更改导致 HTTP header 验证比所需的更严格 (#13615)。除此之外&#xff0c;当使用 n…

隐私交易成新刚需,Unijoin 凭什么优势杀出重围?

随着区块链技术的普及和发展&#xff0c;全球加密货币用户在持续增长&#xff0c;根据火币研究院公布的数据&#xff0c;2022年全球加密用户已达到 3.2亿人&#xff0c;目前全球人口总数超过了 80亿&#xff0c;加密货币用户渗透率已达到了 4%。 尤其是在 2020 年开启的 DeFi 牛…

mysql面试题12:讲一讲MySQL中什么是半同步复制?底层实现?

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:讲一讲mysql中什么是半同步复制?底层实现? MySQL中的半同步复制(Semi-Synchronous Replication)是一种复制模式,它在主服务器将数据写入到二…

数组(数据结构)

优质博文&#xff1a;IT-BLOG-CN 一、简介 数组Array是一种线性表数据结构&#xff0c;它用一组连续的内存空间&#xff0c;存储一组具有相同类型的数据。 数组因具有连续的内存空间的特点&#xff0c;数据拥有非常高效率的“随机访问”&#xff0c;时间复杂度为O(1)。但因要保…