• 王杰国庆作业day6


    服务器

    1. #include
    2. #include
    3. #include
    4. #include
    5. #define PORT 2324 //端口号
    6. #define IP "192.168.10.107" //本机IP
    7. int main(int argc, const char *argv[])
    8. {
    9. sqlite3* db=NULL;
    10. if(sqlite3_open("./my.db",&db)!=SQLITE_OK)
    11. {
    12. fprintf(stderr,"sqlite3_open %d : %s __%d__\n",\
    13. sqlite3_errcode(db),sqlite3_errmsg(db),__LINE__);
    14. return -1;
    15. }
    16. printf("database open success __%d__\n",__LINE__);
    17. //创建一张表格
    18. char sql[128]="create table if not exists stu (name char,password int);";
    19. char* errmsg=NULL;
    20. if(sqlite3_exec(db,sql,NULL,NULL,&errmsg)!=SQLITE_OK)
    21. {
    22. fprintf(stderr,"sqlite3_exec: %s __%d__\n",errmsg,__LINE__);
    23. return -1;
    24. }
    25. printf("create table stu success\n");
    26. //创建流式套接字
    27. int sfd = socket(AF_INET,SOCK_STREAM,0);
    28. if(sfd<0)
    29. {
    30. ERR_MSG("socket");
    31. return -1;
    32. }
    33. printf("socket create success\n");
    34. //允许端口快速复用
    35. int reuse = 1;
    36. if(setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) < 0)
    37. {
    38. ERR_MSG("setsockopt");
    39. return -1;
    40. }
    41. printf("允许端口快速复用成功\n");
    42. //填充地址信息结构体给bind函数绑定使用
    43. //真实地址信息结构体根据地质族指定,AF_INET;man 7 ip
    44. struct sockaddr_in sin;
    45. sin.sin_family = AF_INET; //必须填AF_INET;
    46. sin.sin_port = htons(PORT); //端口号网络字节序,1024-49151
    47. sin.sin_addr.s_addr = inet_addr(IP); //本机IP的网络字节序,ifconfig
    48. //绑定服务器的地址信息》必须绑定
    49. if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin))<0)
    50. {
    51. ERR_MSG("bind");
    52. return -1;
    53. }
    54. printf("bind success\n");
    55. //将套接字转换成被动监听状态
    56. if(listen(sfd,128)<0)
    57. {
    58. ERR_MSG("listen");
    59. return -1;
    60. }
    61. printf("listen success\n");
    62. struct sockaddr_in cin;
    63. socklen_t addrlen = sizeof(cin);
    64. //获取连接成功的客户端信息,生成新的文件描述符
    65. //该文件描述符才是与客户端通信的文件描述符
    66. //int newfd = accept(sfd,NULL,NULL);
    67. int newfd = accept(sfd,(struct sockaddr*)&cin,&addrlen);
    68. if(newfd<0)
    69. {
    70. ERR_MSG("accept");
    71. return -1;
    72. }
    73. printf("[%s:%d] newfd =%d 客户端连接成功__%d__\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),newfd,__LINE__);
    74. char buf[128]="";
    75. ssize_t res=0;
    76. int flag=0;
    77. while(1)
    78. {
    79. bzero(buf,sizeof(buf));
    80. //接收数据
    81. res=recv(newfd,buf,sizeof(buf),0);
    82. if(res<0)
    83. {
    84. ERR_MSG("recv");
    85. return -1;
    86. }
    87. else if(0==res)
    88. {
    89. printf("[%s:%d] newfd=%d : 客户端下线 __%d__\n",\
    90. inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),newfd,__LINE__);
    91. break;
    92. }
    93. // char* p=ntohs(buf);
    94. int i;
    95. char str[128]="";
    96. for(i=0;buf[i]!=' ';i++)
    97. {
    98. str[i]=buf[i];
    99. }
    100. str[i]=buf[i];
    101. char sql[128]="select name from stu;";
    102. char **pres=NULL;
    103. int row,column;
    104. char* errmsg=NULL;
    105. if(sqlite3_get_table(db,sql,&pres,&row,&column,&errmsg)!=SQLITE_OK)
    106. {
    107. fprintf(stderr,"sqlite3_get_table: %s \n",errmsg);
    108. return -1;
    109. }
    110. for(int i=0;i1;i++)
    111. {
    112. for(int j=0;j
    113. {
    114. if(strcmp(str,pres[(i*column)+j])==0)
    115. {
    116. printf("重复注册\n");
    117. flag=1;
    118. }
    119. }
    120. }
    121. if(flag==0){
    122. sqlite3_free_table(pres);
    123. char sql1[128]="";
    124. char* p1=buf+strlen(str);
    125. sprintf(sql1,"insert into stu values(\"%s\",\"%s\");",str,p1);
    126. char* errmsg1 = NULL;
    127. if(sqlite3_exec(db,sql1,NULL,NULL,&errmsg1)!=SQLITE_OK)
    128. {
    129. fprintf(stderr,"sqlite3_exec: %s __%d__\n",errmsg1,__LINE__);
    130. return -1;
    131. }
    132. printf("insert success\n");
    133. if(strcmp(buf,"quit")==0)
    134. break;
    135. //发送数据
    136. strcat(buf," add success");
    137. if(send(newfd,buf,sizeof(buf),0)<0)
    138. {
    139. ERR_MSG("send");
    140. return -1;
    141. }
    142. printf("send success\n");
    143. }
    144. else if(flag==1)
    145. break;
    146. }
    147. //关闭套接字
    148. close(sfd);
    149. close(newfd);
    150. return 0;
    151. }

    客户端

    1. #include
    2. #include
    3. #include
    4. #include
    5. #define SER_PORT 2324 //端口号
    6. #define SER_IP "192.168.10.107" //本机IP
    7. int main(int argc, const char *argv[])
    8. {
    9. //创建流式套接字
    10. int cfd = socket(AF_INET,SOCK_STREAM,0);
    11. if(cfd<0)
    12. {
    13. ERR_MSG("socket");
    14. return -1;
    15. }
    16. printf("socket create success\n");
    17. //允许端口快速复用
    18. int reuse = 1;
    19. if(setsockopt(cfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) < 0)
    20. {
    21. ERR_MSG("setsockopt");
    22. return -1;
    23. }
    24. printf("允许端口快速复用成功\n");
    25. //填充地址信息结构体给bind函数绑定使用
    26. //真实地址信息结构体根据地质族指定,AF_INET;man 7 ip
    27. struct sockaddr_in sin;
    28. sin.sin_family = AF_INET; //必须填AF_INET;
    29. sin.sin_port = htons(SER_PORT); //端口号网络字节序,1024-49151
    30. sin.sin_addr.s_addr = inet_addr(SER_IP); //本机IP的网络字节序,ifconfig
    31. if(connect(cfd,(struct sockaddr*)&sin,sizeof(sin))<0)
    32. {
    33. ERR_MSG("connect");
    34. return -1;
    35. }
    36. printf("connect server success\n");
    37. char buf[128]="";
    38. ssize_t res=0;
    39. while(1)
    40. {
    41. bzero(buf,sizeof(buf));
    42. //发送数据
    43. printf("请输入账户 密码>> ");
    44. fgets(buf,sizeof(buf),stdin);
    45. buf[strlen(buf)-1]='\0';
    46. if(send(cfd,buf,sizeof(buf),0)<0)
    47. {
    48. ERR_MSG("send");
    49. return -1;
    50. }
    51. printf("send success\n");
    52. if(strcmp(buf,"quit")==0)
    53. break;
    54. bzero(buf,sizeof(buf));
    55. //接收数据
    56. res=recv(cfd,buf,sizeof(buf),0);
    57. if(res<0)
    58. {
    59. ERR_MSG("recv");
    60. return -1;
    61. }
    62. else if(0==res)
    63. {
    64. printf("[%s:%d] newfd=%d : 服务器下线 __%d__\n",\
    65. SER_IP,SER_PORT,cfd,__LINE__);
    66. break;
    67. }
    68. printf("[%s:%d] newfd=%d : %s __%d__\n",\
    69. SER_IP,SER_PORT,cfd,buf,__LINE__);
    70. }
    71. //关闭套接字
    72. close(cfd);
    73. return 0;
    74. }

    运行结果

  • 相关阅读:
    【Unity入门计划】2D游戏中遮挡问题的处理方法&伪透视
    springcloud springboot nacos版本对应
    MAC中文版 FCPX V10.6.6 专属视频剪辑后期工具安装教程
    实时云渲染技术在虚拟仿真领域的应用
    JavaSE学习--数据类型和运算符
    写给普通用户的Aptos生态交互指南
    TablePlus for Mac/Win:开启高效数据开发新纪元
    2023全国大学生软件测试大赛开发者测试练习题满分答案(PairingHeap2023)
    Tailor:一键式视频智能处理,轻松打造精彩视频!
    man手册查不到pthread_cond_signal
  • 原文地址:https://blog.csdn.net/wwjj26/article/details/133524068