主页 > 电脑硬件  > 

王杰国庆作业day6

王杰国庆作业day6

服务器

#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; }

客户端

#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; }

运行结果

标签:

王杰国庆作业day6由讯客互联电脑硬件栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“王杰国庆作业day6