4-1 TCPServer实现原理

图片.png
图片.png
图片.png

4-2 TCPServer的实现1

图片.png
图片.png
图片.png

4-3 TCPServer的实现2

  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <sys/socket.h>
  6. #include <netinet/in.h>
  7. #define PORT 8444
  8. #define MESSAGE_SIZE 1024
  9. int main(){
  10. int ret = -1;
  11. int socket_fd = -1;
  12. int accept_fd = -1;
  13. int curpos = 0;
  14. int backlog = 10;
  15. int flag = 1;
  16. char in_buf[MESSAGE_SIZE] = {0,};
  17. struct sockaddr_in local_addr, remote_addr;
  18. //create a tcp socket
  19. socket_fd = socket(AF_INET, SOCK_STREAM, 0);
  20. if ( socket_fd == -1 ){
  21. perror("create socket error");
  22. exit(1);
  23. }
  24. //set option of socket
  25. ret = setsockopt(socket_fd, SOL_SOCKET, SO_REUSEADDR, &flag, sizeof(flag));
  26. if ( ret == -1 ){
  27. perror("setsockopt error");
  28. }
  29. //set local address
  30. local_addr.sin_family = AF_INET;
  31. local_addr.sin_port = htons(PORT);
  32. local_addr.sin_addr.s_addr = INADDR_ANY;
  33. bzero(&(local_addr.sin_zero), 8);
  34. //bind socket
  35. ret = bind(socket_fd, (struct sockaddr *)&local_addr, sizeof(struct sockaddr_in));
  36. if(ret == -1 ) {
  37. perror("bind error");
  38. exit(1);
  39. }
  40. ret = listen(socket_fd, backlog);
  41. if ( ret == -1 ){
  42. perror("listen error");
  43. exit(1);
  44. }
  45. //loop
  46. for(;;){
  47. int addr_len = sizeof( struct sockaddr_in );
  48. //accept an new connection
  49. accept_fd = accept( socket_fd, (struct sockaddr *)&remote_addr, &addr_len );
  50. for(;;){
  51. memset(in_buf, 0, MESSAGE_SIZE);
  52. //receive network data and print it
  53. ret = recv( accept_fd ,(void*)in_buf ,MESSAGE_SIZE ,0 );
  54. if(ret == 0 ){
  55. break;
  56. }
  57. printf( "receive message:%s\n", in_buf );
  58. send(accept_fd, (void*)in_buf, MESSAGE_SIZE, 0);
  59. }
  60. printf("close client connection...\n");
  61. close(accept_fd);
  62. }
  63. printf("quit server...\n");
  64. close(socket_fd);
  65. return 0;
  66. }

4-4 TCP客户端的实现

图片.png

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include <unistd.h>
  5. #include <fcntl.h>
  6. #include <errno.h>
  7. #include <netdb.h>
  8. #include <sys/stat.h>
  9. #include <sys/types.h>
  10. #include <sys/socket.h>
  11. #include <netinet/in.h>
  12. #include <arpa/inet.h>
  13. #define SERVER_PORT 8111
  14. #define MESSAGE_LENGTH 1024
  15. int main()
  16. {
  17. int ret = -1;
  18. int socket_fd;
  19. //server addr
  20. struct sockaddr_in serverAddr;
  21. char sendbuf[MESSAGE_LENGTH];
  22. char recvbuf[MESSAGE_LENGTH];
  23. int data_len;
  24. if((socket_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
  25. {
  26. perror("socket");
  27. return 1;
  28. }
  29. serverAddr.sin_family = AF_INET;
  30. serverAddr.sin_port = htons(SERVER_PORT);
  31. //inet_addr()函数,将点分十进制IP转换成网络字节序IP
  32. serverAddr.sin_addr.s_addr = inet_addr("39.105.185.198");
  33. //serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
  34. if(connect(socket_fd, (struct sockaddr *)&serverAddr, sizeof(serverAddr)) < 0)
  35. {
  36. perror("connect");
  37. return 1;
  38. }
  39. printf("success to connect server...\n");
  40. while(1)
  41. {
  42. memset(sendbuf, 0, MESSAGE_LENGTH);
  43. printf("<<<<send message:");
  44. gets(sendbuf);
  45. //printf("\n");
  46. ret = send(socket_fd, sendbuf, strlen(sendbuf), 0);
  47. if(ret <= 0 ){
  48. printf("the connection is disconnection!\n");
  49. break;
  50. }
  51. if(strcmp(sendbuf, "quit") == 0){
  52. break;
  53. }
  54. printf(">>> echo message:");
  55. recvbuf[0] = '\0';
  56. data_len = recv(socket_fd, recvbuf, MESSAGE_LENGTH, 0);
  57. recvbuf[data_len] = '\0';
  58. printf("%s\n", recvbuf);
  59. }
  60. close(socket_fd);
  61. return 0;
  62. }

4-5 作业-UDP服务端与客户端的实现

图片.png

udp_server.c

  1. #include <sys/types.h>
  2. #include <sys/socket.h>
  3. #include <pthread.h>
  4. #include <netinet/in.h>
  5. #include <stdio.h>
  6. #include <string.h>
  7. #include <unistd.h>
  8. #include <stdlib.h>
  9. #include <arpa/inet.h>
  10. int main(int argc, char * *argv)
  11. {
  12. struct sockaddr_in addr;
  13. addr.sin_family = AF_INET;
  14. addr.sin_port = htons(9876);
  15. addr.sin_addr.s_addr = htonl(INADDR_ANY);
  16. char buff_recv[512] = {0};
  17. char buff_send[512] = "world";
  18. struct sockaddr_in clientAddr;
  19. int n;
  20. int len = sizeof(clientAddr);
  21. int sock;
  22. printf("Welcome! This is a UDP server.\n");
  23. if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
  24. {
  25. printf("socket error.\n");
  26. exit(1);
  27. }
  28. if (bind(sock, (struct sockaddr *) &addr, sizeof(addr)) < 0)
  29. {
  30. printf("bind error.\n");
  31. exit(1);
  32. }
  33. while (1)
  34. {
  35. n = recvfrom(sock, buff_recv, 511, 0, (struct sockaddr *) &clientAddr, &len);
  36. if (n > 0)
  37. {
  38. buff_recv[n] = 0;
  39. printf("recv data from client:%s %u says: %s\n", inet_ntoa(clientAddr.sin_addr), ntohs(clientAddr.sin_port), buff_recv);
  40. n = sendto(sock, buff_send, n, 0, (struct sockaddr *) &clientAddr, sizeof(clientAddr));
  41. if (n < 0)
  42. {
  43. printf("sendto error.\n");
  44. break;
  45. }else {
  46. printf("recv error.\n");
  47. break;
  48. }
  49. }
  50. return 0;
  51. }

udp_client.c

  1. #include <sys/types.h>
  2. #include <sys/socket.h>
  3. #include <pthread.h>
  4. #include <netinet/in.h>
  5. #include <stdio.h>
  6. #include <string.h>
  7. #include <unistd.h>
  8. #include <stdlib.h>
  9. int main(int argc, char * *argv)
  10. {
  11. struct sockaddr_in addr;
  12. int sock;
  13. addr.sin_family = AF_INET;
  14. addr.sin_port = htons(9876);
  15. addr.sin_addr.s_addr = inet_addr("111.231.68.13");
  16. char buff_send[512] = "Hello";
  17. char buff_recv[512] = {0};
  18. int len = sizeof(addr);
  19. int n = 0;
  20. printf("This is a UDP client\n");
  21. if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
  22. {
  23. printf("socket error.\n");
  24. exit(1);
  25. }
  26. if (addr.sin_addr.s_addr == INADDR_NONE)
  27. {
  28. printf("Incorrect ip address!");
  29. close(sock);
  30. exit(1);
  31. }
  32. n = sendto(sock, buff_send, strlen(buff_send), 0, (struct sockaddr *) &addr, sizeof(addr));
  33. if (n < 0)
  34. {
  35. printf("sendto error.\n");
  36. close(sock);
  37. }
  38. n = recvfrom(sock, buff_recv, 512, 0, (struct sockaddr *) &addr, &len);
  39. if (n > 0)
  40. {
  41. buff_recv[n] = 0;
  42. printf("received from sever:");
  43. puts(buff_recv);
  44. }
  45. else if (n == 0)
  46. printf("server closed.\n");
  47. else if (n == -1)
  48. printf("recvfrom error.\n");
  49. close(sock);
  50. return 0;
  51. }

4-6 作业-实现一个TCP/UDP网络服务器

图片.png