王杰国庆作业day6

服务器

cs 复制代码
#include <stdio.h>
#include <string.h>
#include <stdlib.h>	
#include <my_head.h>
#define PORT 2324                //端口号
#define IP "192.168.10.107"     //本机IP
int main(int argc, const char *argv[])
{
	sqlite3* db=NULL;
	if(sqlite3_open("./my.db",&db)!=SQLITE_OK)
	{
		fprintf(stderr,"sqlite3_open %d : %s __%d__\n",\
				sqlite3_errcode(db),sqlite3_errmsg(db),__LINE__);
		return -1;
	}
	printf("database open success __%d__\n",__LINE__);

	//创建一张表格
	char sql[128]="create table if not exists stu (name char,password int);";
	char* errmsg=NULL;
	if(sqlite3_exec(db,sql,NULL,NULL,&errmsg)!=SQLITE_OK)
	{
		fprintf(stderr,"sqlite3_exec: %s __%d__\n",errmsg,__LINE__);
		return -1;
	}
	printf("create table stu success\n");

	//创建流式套接字
	int sfd = socket(AF_INET,SOCK_STREAM,0);
	if(sfd<0)
	{
		ERR_MSG("socket");
		return -1;
	}
	printf("socket create success\n");
	//允许端口快速复用
	int reuse = 1;
    if(setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) < 0)
    {
        ERR_MSG("setsockopt");
        return -1;
    }                                                                           
    printf("允许端口快速复用成功\n");


	//填充地址信息结构体给bind函数绑定使用
	//真实地址信息结构体根据地质族指定,AF_INET;man 7 ip
	struct sockaddr_in sin;
	sin.sin_family = AF_INET;               //必须填AF_INET;
	sin.sin_port = htons(PORT);            //端口号网络字节序,1024-49151
	sin.sin_addr.s_addr = inet_addr(IP);   //本机IP的网络字节序,ifconfig

	//绑定服务器的地址信息》必须绑定
	if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin))<0)
	{
		ERR_MSG("bind");
		return -1;
	}
	printf("bind success\n");

	//将套接字转换成被动监听状态
	if(listen(sfd,128)<0)
	{
		ERR_MSG("listen");
		return -1;
	}
	printf("listen success\n");

	struct sockaddr_in cin;
	socklen_t addrlen = sizeof(cin);
	//获取连接成功的客户端信息,生成新的文件描述符
	//该文件描述符才是与客户端通信的文件描述符
	
	//int newfd = accept(sfd,NULL,NULL);
	int newfd = accept(sfd,(struct sockaddr*)&cin,&addrlen);
	if(newfd<0)
	{
		ERR_MSG("accept");
		return -1;
	}
	printf("[%s:%d] newfd =%d 客户端连接成功__%d__\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),newfd,__LINE__);

	char buf[128]="";
	ssize_t res=0;
	int flag=0;
	while(1)
	{
		bzero(buf,sizeof(buf));
		//接收数据
		res=recv(newfd,buf,sizeof(buf),0);



		if(res<0)
		{
			ERR_MSG("recv");
			return -1;
		}
		else if(0==res)
		{
			printf("[%s:%d] newfd=%d : 客户端下线 __%d__\n",\
					inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),newfd,__LINE__);
			break;
		}

	//	char* p=ntohs(buf);	
		int i;
		char str[128]="";
		for(i=0;buf[i]!=' ';i++)
		{
			str[i]=buf[i];
		}
		str[i]=buf[i];

		char sql[128]="select name from stu;";
		char **pres=NULL;
		int row,column;
		char* errmsg=NULL;
		if(sqlite3_get_table(db,sql,&pres,&row,&column,&errmsg)!=SQLITE_OK)
		{
			fprintf(stderr,"sqlite3_get_table: %s \n",errmsg);
			return -1;
		}
		for(int i=0;i<row+1;i++)
		{
			for(int j=0;j<column;j++)
			{
				if(strcmp(str,pres[(i*column)+j])==0)
				{
					printf("重复注册\n");
					flag=1;
				}
			}
		}
		if(flag==0){
			sqlite3_free_table(pres);

			char sql1[128]="";
			char* p1=buf+strlen(str);
			sprintf(sql1,"insert into stu values(\"%s\",\"%s\");",str,p1);
			char* errmsg1 = NULL;
			if(sqlite3_exec(db,sql1,NULL,NULL,&errmsg1)!=SQLITE_OK)
			{
				fprintf(stderr,"sqlite3_exec: %s __%d__\n",errmsg1,__LINE__);
				return -1;
			}
			printf("insert success\n");


			if(strcmp(buf,"quit")==0)
				break;
			//发送数据
			strcat(buf," add success");
			if(send(newfd,buf,sizeof(buf),0)<0)
			{
				ERR_MSG("send");
				return -1;
			}
			printf("send success\n");
		}
		else if(flag==1)
			break;
	}
	//关闭套接字
	close(sfd);
	close(newfd);
	return 0;
}

客户端

cs 复制代码
#include <stdio.h>
#include <string.h>
#include <stdlib.h>	
#include <my_head.h>
#define SER_PORT 2324                //端口号
#define SER_IP "192.168.10.107"     //本机IP
int main(int argc, const char *argv[])
{
	//创建流式套接字
	int cfd = socket(AF_INET,SOCK_STREAM,0);
	if(cfd<0)
	{
		ERR_MSG("socket");
		return -1;
	}
	printf("socket create success\n");
	//允许端口快速复用
	int reuse = 1;
    if(setsockopt(cfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) < 0)
    {
        ERR_MSG("setsockopt");
        return -1;
    }                                                                           
    printf("允许端口快速复用成功\n");


	//填充地址信息结构体给bind函数绑定使用
	//真实地址信息结构体根据地质族指定,AF_INET;man 7 ip
	struct sockaddr_in sin;
	sin.sin_family = AF_INET;               //必须填AF_INET;
	sin.sin_port = htons(SER_PORT);            //端口号网络字节序,1024-49151
	sin.sin_addr.s_addr = inet_addr(SER_IP);   //本机IP的网络字节序,ifconfig


	if(connect(cfd,(struct sockaddr*)&sin,sizeof(sin))<0)
	{
		ERR_MSG("connect");
		return -1;
	}
	printf("connect server success\n");

	char buf[128]="";
	ssize_t res=0;
	while(1)
	{
		bzero(buf,sizeof(buf));		
		//发送数据
		printf("请输入账户 密码>> ");
		fgets(buf,sizeof(buf),stdin);
		buf[strlen(buf)-1]='\0';
		if(send(cfd,buf,sizeof(buf),0)<0)
		{
			ERR_MSG("send");
			return -1;
		}
		printf("send success\n");

		if(strcmp(buf,"quit")==0)
			break;

		bzero(buf,sizeof(buf));
		//接收数据
		res=recv(cfd,buf,sizeof(buf),0);
		if(res<0)
		{
			ERR_MSG("recv");
			return -1;
		}
		else if(0==res)
		{
			printf("[%s:%d] newfd=%d : 服务器下线 __%d__\n",\
					SER_IP,SER_PORT,cfd,__LINE__);
			break;
		}
			printf("[%s:%d] newfd=%d : %s  __%d__\n",\
					SER_IP,SER_PORT,cfd,buf,__LINE__);
	}
	//关闭套接字
	close(cfd);
	return 0;
}

运行结果

相关推荐
青い月の魔女10 分钟前
数据结构初阶---二叉树
c语言·数据结构·笔记·学习·算法
最后一个bug1 小时前
STM32MP1linux根文件系统目录作用
linux·c语言·arm开发·单片机·嵌入式硬件
FeboReigns1 小时前
C++简明教程(4)(Hello World)
c语言·c++
FeboReigns1 小时前
C++简明教程(10)(初识类)
c语言·开发语言·c++
小猿_002 小时前
C语言实现顺序表详解
c语言·开发语言
Dola_Pan3 小时前
C语言:随机读写文件、实现文件复制功能
c语言·开发语言
佳心饼干-3 小时前
C语言-08复合类型-结构体
c语言·开发语言
F-2H3 小时前
C语言:指针3(函数指针与指针函数)
linux·c语言·开发语言·c++
wkd_0075 小时前
【开源库 | xlsxio】C/C++读写.xlsx文件,xlsxio 在 Linux(Ubuntu18.04)的编译、交叉编译
c语言·c++·xlsxio·c语言读写xlsx·c++读写xlsx·xlsxio交叉编译
Ocean☾6 小时前
C语言-基因序列转换独热码(one-hot code)
c语言·开发语言