国庆作业6

TCP服务器

cs 复制代码
#include "head.h"
#define PORT 2580                //端口号
#define IP "192.168.31.219"     //本机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;
		}
 
		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 **pre=NULL;
		int row,column;
		char* errmsg=NULL;
		if(sqlite3_get_table(db,sql,&pre,&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,pre[(i*column)+j])==0)
				{
					printf("重复注册\n");
					flag=1;
				}
			}
		}
		if(flag==0){
			sqlite3_free_table(pre);
 
			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;
}

TCP客户端

cs 复制代码
#include "head.h"
#define SER_PORT 2580                //端口号
#define SER_IP "192.168.31.219"     //本机IP
int main(int argc, const char *argv[])
{
	//创建流式套接字
	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(SER_PORT);            //端口号网络字节序,1024-49151
	sin.sin_addr.s_addr = inet_addr(SER_IP);   //本机IP的网络字节序,ifconfig
 
 
	if(connect(sfd,(struct sockaddr*)&sin,sizeof(sin))<0)
	{
		ERR_MSG("connect");
		return -1;
	}
	printf("connect 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(sfd,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(sfd,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,sfd,__LINE__);
			break;
		}
			printf("[%s:%d] newfd=%d : %s  __%d__\n",\
					SER_IP,SER_PORT,sfd,buf,__LINE__);
	}
	//关闭套接字
	close(sfd);
	return 0;
}
相关推荐
繁依Fanyi15 分钟前
用 CodeBuddy 实现「IdeaSpark 每日灵感卡」:一场 UI 与灵感的极简之旅
开发语言·前端·游戏·ui·编辑器·codebuddy首席试玩官
duapple4 小时前
Golang基于反射的ioctl实现
开发语言·后端·golang
Dxy12393102164 小时前
Python 条件语句详解
开发语言·python
字节源流5 小时前
关于maven的依赖下不下来的问题
java·maven
pjx9876 小时前
服务间的“握手”:OpenFeign声明式调用与客户端负载均衡
java·运维·spring·负载均衡
prinrf('千寻)6 小时前
MyBatis-Plus 的 updateById 方法不更新 null 值属性的问题
java·开发语言·mybatis
老华带你飞6 小时前
实习记录小程序|基于SSM+Vue的实习记录小程序设计与实现(源码+数据库+文档)
java·数据库·spring boot·小程序·论文·毕设·实习记录小程序
m0_555762906 小时前
Qt缓动曲线详解
开发语言·qt
在未来等你7 小时前
互联网大厂Java求职面试:AI与大模型应用集成及云原生挑战
java·微服务·ai·kubernetes·大模型·embedding·spring ai
源码技术栈7 小时前
SaaS基于云计算、大数据的Java云HIS平台信息化系统源码
java·大数据·云计算·云his·his系统·云医院·区域his