main.c 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  1. #include <arpa/inet.h>
  2. #include <fcntl.h>
  3. #include <signal.h>
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <string.h>
  7. #include <unistd.h>
  8. #define CONN_QUEUE_SIZE 20
  9. #define BUFFER_SIZE 1024
  10. #define SERVER_PORT 12580
  11. int server_sockfd;
  12. int conn;
  13. void signal_handler(int signo)
  14. {
  15. printf("Server is exiting...\n");
  16. close(conn);
  17. close(server_sockfd);
  18. exit(0);
  19. }
  20. static char logo[] =
  21. " ____ ___ ____ \n| _ \\ _ __ __ _ __ _ ___ _ __ / _ \\ / ___| "
  22. "\n| | | || '__| / _` | / _` | / _ \\ | '_ \\ | | | |\\___ \\ \n| |_| || | | (_| || (_| || (_) || | | || |_| | "
  23. "___) |\n|____/ |_| \\__,_| \\__, | \\___/ |_| |_| \\___/ |____/ \n |___/ \n";
  24. void tcp_server()
  25. {
  26. printf("TCP Server is running...\n");
  27. server_sockfd = socket(AF_INET, SOCK_STREAM, 0);
  28. printf("socket() ok, server_sockfd=%d\n", server_sockfd);
  29. struct sockaddr_in server_sockaddr;
  30. server_sockaddr.sin_family = AF_INET;
  31. server_sockaddr.sin_port = htons(SERVER_PORT);
  32. server_sockaddr.sin_addr.s_addr = htonl(INADDR_ANY);
  33. if (bind(server_sockfd, (struct sockaddr *)&server_sockaddr, sizeof(server_sockaddr)))
  34. {
  35. perror("Server bind error.\n");
  36. exit(1);
  37. }
  38. printf("TCP Server is listening...\n");
  39. if (listen(server_sockfd, CONN_QUEUE_SIZE) == -1)
  40. {
  41. perror("Server listen error.\n");
  42. exit(1);
  43. }
  44. printf("listen() ok\n");
  45. char buffer[BUFFER_SIZE];
  46. struct sockaddr_in client_addr;
  47. socklen_t client_length = sizeof(client_addr);
  48. /*
  49. Await a connection on socket FD.
  50. When a connection arrives, open a new socket to communicate with it,
  51. set *ADDR (which is *ADDR_LEN bytes long) to the address of the connecting
  52. peer and *ADDR_LEN to the address's actual length, and return the
  53. new socket's descriptor, or -1 for errors.
  54. */
  55. conn = accept(server_sockfd, (struct sockaddr *)&client_addr, &client_length);
  56. printf("Connection established.\n");
  57. if (conn < 0)
  58. {
  59. printf("Create connection failed, code=%d\n", conn);
  60. exit(1);
  61. }
  62. send(conn, logo, sizeof(logo), 0);
  63. while (1)
  64. {
  65. memset(buffer, 0, sizeof(buffer));
  66. int len = recv(conn, buffer, sizeof(buffer), 0);
  67. if (len <= 0)
  68. {
  69. printf("Receive data failed! len=%d\n", len);
  70. break;
  71. }
  72. if (strcmp(buffer, "exit\n") == 0)
  73. {
  74. break;
  75. }
  76. printf("Received: %s\n", buffer);
  77. send(conn, buffer, len, 0);
  78. }
  79. close(conn);
  80. close(server_sockfd);
  81. }
  82. void udp_server()
  83. {
  84. printf("UDP Server is running...\n");
  85. server_sockfd = socket(AF_INET, SOCK_DGRAM, 0);
  86. printf("socket() ok, server_sockfd=%d\n", server_sockfd);
  87. struct sockaddr_in server_sockaddr;
  88. server_sockaddr.sin_family = AF_INET;
  89. server_sockaddr.sin_port = htons(SERVER_PORT);
  90. server_sockaddr.sin_addr.s_addr = htonl(INADDR_ANY);
  91. if (bind(server_sockfd, (struct sockaddr *)&server_sockaddr, sizeof(server_sockaddr)))
  92. {
  93. perror("Server bind error.\n");
  94. exit(1);
  95. }
  96. printf("UDP Server is listening...\n");
  97. char buffer[BUFFER_SIZE];
  98. struct sockaddr_in client_addr;
  99. socklen_t client_length = sizeof(client_addr);
  100. while (1)
  101. {
  102. memset(buffer, 0, sizeof(buffer));
  103. int len = recvfrom(server_sockfd, buffer, sizeof(buffer), 0, (struct sockaddr *)&client_addr, &client_length);
  104. if (len <= 0)
  105. {
  106. printf("Receive data failed! len=%d", len);
  107. break;
  108. }
  109. if (strcmp(buffer, "exit\n") == 0)
  110. {
  111. break;
  112. }
  113. printf("Received: %s", buffer);
  114. sendto(server_sockfd, buffer, len, 0, (struct sockaddr *)&client_addr, client_length);
  115. printf("Send: %s", buffer);
  116. }
  117. close(conn);
  118. close(server_sockfd);
  119. }
  120. void tcp_client()
  121. {
  122. printf("Client is running...\n");
  123. int client_sockfd = socket(AF_INET, SOCK_STREAM, 0);
  124. struct sockaddr_in server_addr = {0};
  125. server_addr.sin_family = AF_INET;
  126. server_addr.sin_port = htons(12581);
  127. server_addr.sin_addr.s_addr = inet_addr("192.168.199.129");
  128. printf("to connect\n");
  129. if (connect(client_sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0)
  130. {
  131. perror("Failed to establish connection to server\n");
  132. exit(1);
  133. }
  134. printf("connected to server\n");
  135. char sendbuf[BUFFER_SIZE] = {0};
  136. char recvbuf[BUFFER_SIZE] = {0};
  137. int x = recv(client_sockfd, recvbuf, sizeof(recvbuf), 0);
  138. fputs(recvbuf, stdout);
  139. memset(recvbuf, 0, sizeof(recvbuf));
  140. while (1)
  141. {
  142. fgets(sendbuf, sizeof(sendbuf), stdin);
  143. sendbuf[0] = 'a';
  144. // printf("to send\n");
  145. send(client_sockfd, sendbuf, strlen(sendbuf), 0);
  146. // printf("send ok\n");
  147. if (strcmp(sendbuf, "exit\n") == 0)
  148. {
  149. break;
  150. }
  151. int x = recv(client_sockfd, recvbuf, sizeof(recvbuf), 0);
  152. if (x < 0)
  153. {
  154. printf("recv error, retval=%d\n", x);
  155. break;
  156. }
  157. fputs(recvbuf, stdout);
  158. memset(recvbuf, 0, sizeof(recvbuf));
  159. memset(sendbuf, 0, sizeof(sendbuf));
  160. }
  161. close(client_sockfd);
  162. }
  163. void udp_client()
  164. {
  165. struct sockaddr_in addr;
  166. int sockfd, len = 0;
  167. int addr_len = sizeof(struct sockaddr_in);
  168. char buffer[256];
  169. /* 建立socket,注意必须是SOCK_DGRAM */
  170. if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
  171. {
  172. perror("socket");
  173. exit(1);
  174. }
  175. /* 填写sockaddr_in*/
  176. bzero(&addr, sizeof(addr));
  177. addr.sin_family = AF_INET;
  178. addr.sin_port = htons(12581);
  179. addr.sin_addr.s_addr = inet_addr("192.168.199.129");
  180. printf("to send logo\n");
  181. sendto(sockfd, logo, sizeof(logo), 0, (struct sockaddr *)&addr, addr_len);
  182. printf("send logo ok\n");
  183. while (1)
  184. {
  185. bzero(buffer, sizeof(buffer));
  186. printf("Please enter a string to send to server: \n");
  187. /* 从标准输入设备取得字符串*/
  188. len = read(STDIN_FILENO, buffer, sizeof(buffer));
  189. printf("to send: %d\n", len);
  190. /* 将字符串传送给server端*/
  191. sendto(sockfd, buffer, len, 0, (struct sockaddr *)&addr, addr_len);
  192. /* 接收server端返回的字符串*/
  193. len = recvfrom(sockfd, buffer, sizeof(buffer), 0, (struct sockaddr *)&addr, &addr_len);
  194. printf("Receive from server: %s\n", buffer);
  195. }
  196. return 0;
  197. }
  198. void main()
  199. {
  200. // signal(SIGKILL, signal_handler);
  201. // signal(SIGINT, signal_handler);
  202. tcp_server();
  203. // udp_server();
  204. // tcp_client();
  205. // udp_client();
  206. }