单个服务器和客户端的通信

阳光穿透心脏的1/2处 2022-07-13 08:43 308阅读 0赞

创建一个客户端,一个服务器。
要求:客户端传小写字母给服务器,服务器接收后转换成大写字母回传给客户端。

效果:客户端处循环输入一个字母,返回一个大写字母。(可以添加说明printf()输入为 / 转换后输出为)

  1. /*********************************************************************
  2. File Name: tcp_net_socket.h
  3. Author: date:
  4. Description:
  5. Fuction List:
  6. ********************************************************************/
  7. #ifndef _TCP_NET_SOCKET_H
  8. #define _TCP_NET_SOCKET_H
  9. #include <stdio.h>
  10. #include <sys/types.h>
  11. #include <sys/socket.h>
  12. #include <string.h>
  13. #include <stdlib.h>
  14. #include <netinet/in.h>
  15. #include <arpa/inet.h>
  16. #include <unistd.h>
  17. #include <signal.h>
  18. #define SERV_PORT 9000
  19. extern int tcp_init();
  20. extern int tcp_accept(int sfd);
  21. extern int tcp_connet();
  22. extern void signalhandler(void);
  23. #endif
  24. /*********************************************************************
  25. File Name: tcp_net_socket.c
  26. Author: date:
  27. Description:
  28. Fuction List: int tcp_init() //用于初始化操作
  29. int tcp_accept(int sfd) //用于服务器的接收
  30. int tcp_connect(const char* ip) //用于客户端的连接
  31. void signalhandler(void) //用于信号处理,让服务器在按下Ctrl+c或Ctrl+\时不会退出
  32. ********************************************************************/
  33. #include "tcp_net_socket.h"
  34. //用于初始化操作
  35. int tcp_init()
  36. {
  37. int sfd = socket(AF_INET, SOCK_STREAM, 0); //创建套接字
  38. if(sfd == -1)
  39. {
  40. perror("socket");
  41. return -1;
  42. }
  43. int ret;
  44. struct sockaddr_in serveraddr;
  45. memset(&serveraddr,0,sizeof(struct sockaddr));
  46. serveraddr.sin_family = AF_INET;
  47. serveraddr.sin_port = htons(SERV_PORT);
  48. serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);
  49. ret = bind(sfd, (struct sockaddr*)&serveraddr, sizeof(struct sockaddr));
  50. if(ret == -1)
  51. {
  52. perror("bind");
  53. return -1;
  54. }
  55. ret = listen(sfd,10); //监听它,并设置允许最大的连接数为10个
  56. if(ret == -1)
  57. {
  58. perror("listen");
  59. close(sfd);
  60. return -1;
  61. }
  62. return sfd;
  63. }
  64. //用于服务器的接收
  65. int tcp_accept(int sfd)
  66. {
  67. struct sockaddr_in clientaddr;
  68. memset(&clientaddr, 0, sizeof(struct sockaddr));
  69. int addrlen = sizeof(struct sockaddr);
  70. //sfd接受客户端的连接,并创建新的socket为new_fd,将请求连接的客户端的ip、port保存在结构体clientaddr中
  71. int new_fd = accept(sfd, (struct sockaddr*)&clientaddr, &addrlen);
  72. if(new_fd == -1)
  73. {
  74. perror("accept");
  75. close(sfd);
  76. return -1;
  77. }
  78. printf("%s %d success connet...\n",
  79. inet_ntoa(clientaddr.sin_addr),ntohs(clientaddr.sin_port));
  80. return new_fd;
  81. }
  82. //用于客户端的连接
  83. int tcp_connect(const char* ip)
  84. {
  85. int ret;
  86. int sfd = socket(AF_INET, SOCK_STREAM, 0); //申请新的socket
  87. if(sfd == -1)
  88. {
  89. perror("socket");
  90. return -1;
  91. }
  92. struct sockaddr_in serveraddr;
  93. memset(&serveraddr, 0,sizeof(struct sockaddr));
  94. serveraddr.sin_family = AF_INET;
  95. serveraddr.sin_port = htons(SERV_PORT);
  96. serveraddr.sin_addr.s_addr = inet_addr(ip);
  97. ret = connect(sfd, (struct sockaddr*)&serveraddr, sizeof(struct sockaddr)); //将sfd连接至指定的服务器网络地址 serveraddr
  98. if(ret == -1)
  99. {
  100. perror("connect");
  101. close(sfd);
  102. return -1;
  103. }
  104. return sfd;
  105. }
  106. //用于信号处理,让服务器在按下Ctrl+c或Ctrl+\时不会退出
  107. void signalhandler(void)
  108. {
  109. sigset_t sigSet;
  110. sigemptyset(&sigSet);
  111. sigaddset(&sigSet,SIGINT);
  112. sigaddset(&sigSet,SIGQUIT);
  113. sigprocmask(SIG_BLOCK,&sigSet,NULL);
  114. }
  115. /*********************************************************************
  116. File Name: tcp_net_server.c
  117. Author: xxx date:
  118. Description:
  119. Fuction List:
  120. ********************************************************************/
  121. #include "tcp_net_socket.h"
  122. int main()
  123. {
  124. signalhandler();
  125. int sfd = tcp_init();
  126. int ret;
  127. while(1)
  128. {
  129. int cfd = tcp_accept(sfd);
  130. char buf;
  131. ret = read(cfd, &buf, sizeof(buf));
  132. if(ret == -1)
  133. {
  134. perror("read");
  135. close(cfd);
  136. close(sfd);
  137. return -1;
  138. }
  139. buf = buf - 'a' + 'A';
  140. ret = write(cfd, &buf, 1);
  141. if(ret == -1)
  142. {
  143. perror("write");
  144. close(cfd);
  145. close(sfd);
  146. return -1;
  147. }
  148. close(cfd);
  149. }
  150. close(sfd);
  151. return 0;
  152. }
  153. /*********************************************************************
  154. File Name: tcp_net_client.c
  155. Author: xxx date:
  156. Description:
  157. Fuction List:
  158. ********************************************************************/
  159. #include "tcp_net_socket.h"
  160. int main(int argc, char** argv)
  161. {
  162. if(argc != 2)
  163. {
  164. printf("Usage:./client ip\n");
  165. return -1;
  166. }
  167. int ret;
  168. char buf[2] = {0};
  169. while(1)
  170. {
  171. int sfd = tcp_connect(argv[1]);
  172. memset(&buf,0,sizeof(buf));
  173. printf("请输入小写字母:");
  174. scanf("%s",&buf);
  175. ret = write(sfd, &buf[0], 1);
  176. if(ret == -1)
  177. {
  178. perror("write");
  179. return -1;
  180. }
  181. ret = read(sfd, &buf[0], sizeof(char));
  182. if(ret == -1)
  183. {
  184. perror("read");
  185. return -1;
  186. }
  187. printf("转换后的大写字母为:");
  188. printf("%c\n",buf[0]);
  189. close(sfd);
  190. }
  191. return 0;
  192. }

发表评论

表情:
评论列表 (有 0 条评论,308人围观)

还没有评论,来说两句吧...

相关阅读

    相关 客户服务器程序通信

    在介绍客户端和服务器通信方式之前,首先要介绍一下网络通信的模型。先了解通信模型,然后再了解通信方式。 一、通信模型        目前主流的网络通信模型有以下两种: