TCP服务器/客户端实例(C/C++)

青旅半醒 2022-04-01 09:58 553阅读 0赞

原文链接:https://blog.csdn.net/qq_40194498/article/details/80245607

本篇博客阅读有障碍请参阅:网络编程入门

1.1、Linux下的TCP服务器:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <unistd.h>
  5. #include <arpa/inet.h>
  6. #include <sys/types.h>
  7. #include <sys/socket.h>
  8. void error_handling(char *message);
  9. int main(int argc, char *argv[])
  10. {
  11. int serv_sock;
  12. int clnt_sock;
  13. struct sockaddr_in serv_addr;
  14. struct sockaddr_in clnt_addr;
  15. socklen_t clnt_addr_size;
  16. char message[]="Hello World!";
  17. if(argc!=2){
  18. printf("Usage : %s <port>\n", argv[0]);
  19. exit(1);
  20. }
  21. serv_sock=socket(PF_INET, SOCK_STREAM, 0);
  22. if(serv_sock == -1)
  23. error_handling("socket() error");
  24. memset(&serv_addr, 0, sizeof(serv_addr));
  25. serv_addr.sin_family=AF_INET;
  26. serv_addr.sin_addr.s_addr=htonl(INADDR_ANY);
  27. serv_addr.sin_port=htons(atoi(argv[1]));
  28. if(bind(serv_sock, (struct sockaddr*) &serv_addr, sizeof(serv_addr))==-1)
  29. error_handling("bind() error");
  30. if(listen(serv_sock, 5)==-1)
  31. error_handling("listen() error");
  32. clnt_addr_size=sizeof(clnt_addr);
  33. clnt_sock=accept(serv_sock, (struct sockaddr*)&clnt_addr,&clnt_addr_size);
  34. if(clnt_sock==-1)
  35. error_handling("accept() error");
  36. write(clnt_sock, message, sizeof(message));
  37. close(clnt_sock);
  38. close(serv_sock);
  39. return 0;
  40. }
  41. void error_handling(char *message)
  42. {
  43. fputs(message, stderr);
  44. fputc('\n', stderr);
  45. exit(1);
  46. }
  47. 1
  48. 2
  49. 3
  50. 4
  51. 5
  52. 6
  53. 7
  54. 8
  55. 9
  56. 10
  57. 11
  58. 12
  59. 13
  60. 14
  61. 15
  62. 16
  63. 17
  64. 18
  65. 19
  66. 20
  67. 21
  68. 22
  69. 23
  70. 24
  71. 25
  72. 26
  73. 27
  74. 28
  75. 29
  76. 30
  77. 31
  78. 32
  79. 33
  80. 34
  81. 35
  82. 36
  83. 37
  84. 38
  85. 39
  86. 40
  87. 41
  88. 42
  89. 43
  90. 44
  91. 45
  92. 46
  93. 47
  94. 48
  95. 49
  96. 50
  97. 51
  98. 52
  99. 53
  100. 54
  101. 55
  102. 56
  103. 57
  104. 58
  105. 59
  106. 60

1.2、Linux下的TCP客户端:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <unistd.h>
  5. #include <arpa/inet.h>
  6. #include <sys/types.h>
  7. #include <sys/socket.h>
  8. void error_handling(char *message);
  9. int main(int argc, char* argv[])
  10. {
  11. int sock;
  12. struct sockaddr_in serv_addr;
  13. char message[30];
  14. int str_len=0;
  15. int idx=0, read_len=0;
  16. if(argc!=3){
  17. printf("Usage : %s <IP> <port>\n", argv[0]);
  18. exit(1);
  19. }
  20. sock=socket(PF_INET, SOCK_STREAM, 0);
  21. if(sock == -1)
  22. error_handling("socket() error");
  23. memset(&serv_addr, 0, sizeof(serv_addr));
  24. serv_addr.sin_family=AF_INET;
  25. serv_addr.sin_addr.s_addr=inet_addr(argv[1]);
  26. serv_addr.sin_port=htons(atoi(argv[2]));
  27. if(connect(sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr))==-1)
  28. error_handling("connect() error!");
  29. while(read_len=read(sock, &message[idx++], 1))
  30. {
  31. if(read_len==-1)
  32. error_handling("read() error!");
  33. str_len+=read_len;
  34. }
  35. printf("Message from server: %s \n", message);
  36. printf("Function read call count: %d \n", str_len);
  37. close(sock);
  38. return 0;
  39. }
  40. void error_handling(char *message)
  41. {
  42. fputs(message, stderr);
  43. fputc('\n', stderr);
  44. exit(1);
  45. }
  46. 1
  47. 2
  48. 3
  49. 4
  50. 5
  51. 6
  52. 7
  53. 8
  54. 9
  55. 10
  56. 11
  57. 12
  58. 13
  59. 14
  60. 15
  61. 16
  62. 17
  63. 18
  64. 19
  65. 20
  66. 21
  67. 22
  68. 23
  69. 24
  70. 25
  71. 26
  72. 27
  73. 28
  74. 29
  75. 30
  76. 31
  77. 32
  78. 33
  79. 34
  80. 35
  81. 36
  82. 37
  83. 38
  84. 39
  85. 40
  86. 41
  87. 42
  88. 43
  89. 44
  90. 45
  91. 46
  92. 47
  93. 48
  94. 49
  95. 50
  96. 51
  97. 52
  98. 53
  99. 54
  100. 55
  101. 56
  102. 57

1.3、Linux下运行示例:

这里写图片描述
如图,将源文件生成可执行文件之后,在一个终端里执行服务器程序并设置好端口./tcp_server 8087
开启另一个终端执行客户端并设置好IP地址和端口号:
./tcp_client 127.0.0.1 8087

当然,也可以使用符号&在后台运行程序,使得可以在一个终端运行两个程序:
这里写图片描述

2.1、Windows下的TCP服务器:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <winsock2.h>
  4. void ErrorHandling(char* message);
  5. int main(int argc, char* argv[])
  6. {
  7. WSADATA wsaData;
  8. SOCKET hServSock, hClntSock;
  9. SOCKADDR_IN servAddr, clntAddr;
  10. int szClntAddr;
  11. char message[]="Hello World!";
  12. if(argc!=2)
  13. {
  14. printf("Usage : %s <port>\n", argv[0]);
  15. exit(1);
  16. }
  17. if(WSAStartup(MAKEWORD(2, 2), &wsaData)!=0)
  18. ErrorHandling("WSAStartup() error!");
  19. hServSock=socket(PF_INET, SOCK_STREAM, 0);
  20. if(hServSock==INVALID_SOCKET)
  21. ErrorHandling("socket() error");
  22. memset(&servAddr, 0, sizeof(servAddr));
  23. servAddr.sin_family=AF_INET;
  24. servAddr.sin_addr.s_addr=htonl(INADDR_ANY);
  25. servAddr.sin_port=htons(atoi(argv[1]));
  26. if(bind(hServSock, (SOCKADDR*) &servAddr, sizeof(servAddr))==SOCKET_ERROR)
  27. ErrorHandling("bind() error");
  28. if(listen(hServSock, 5)==SOCKET_ERROR)
  29. ErrorHandling("listen() error");
  30. szClntAddr=sizeof(clntAddr);
  31. hClntSock=accept(hServSock, (SOCKADDR*)&clntAddr,&szClntAddr);
  32. if(hClntSock==INVALID_SOCKET)
  33. ErrorHandling("accept() error");
  34. send(hClntSock, message, sizeof(message), 0);
  35. closesocket(hClntSock);
  36. closesocket(hServSock);
  37. WSACleanup();
  38. return 0;
  39. }
  40. void ErrorHandling(char* message)
  41. {
  42. fputs(message, stderr);
  43. fputc('\n', stderr);
  44. exit(1);
  45. }
  46. 1
  47. 2
  48. 3
  49. 4
  50. 5
  51. 6
  52. 7
  53. 8
  54. 9
  55. 10
  56. 11
  57. 12
  58. 13
  59. 14
  60. 15
  61. 16
  62. 17
  63. 18
  64. 19
  65. 20
  66. 21
  67. 22
  68. 23
  69. 24
  70. 25
  71. 26
  72. 27
  73. 28
  74. 29
  75. 30
  76. 31
  77. 32
  78. 33
  79. 34
  80. 35
  81. 36
  82. 37
  83. 38
  84. 39
  85. 40
  86. 41
  87. 42
  88. 43
  89. 44
  90. 45
  91. 46
  92. 47
  93. 48
  94. 49
  95. 50
  96. 51
  97. 52
  98. 53
  99. 54
  100. 55
  101. 56
  102. 57

2.2、Windows下的TCP客户端:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <winsock2.h>
  4. void ErrorHandling(char* message);
  5. int main(int argc, char* argv[])
  6. {
  7. WSADATA wsaData;
  8. SOCKET hSocket;
  9. SOCKADDR_IN servAddr;
  10. char message[30];
  11. int strLen=0;
  12. int idx=0, readLen=0;
  13. if(argc!=3)
  14. {
  15. printf("Usage : %s <IP> <port>\n", argv[0]);
  16. exit(1);
  17. }
  18. if(WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
  19. ErrorHandling("WSAStartup() error!");
  20. hSocket=socket(PF_INET, SOCK_STREAM, 0);
  21. if(hSocket==INVALID_SOCKET)
  22. ErrorHandling("hSocket() error");
  23. memset(&servAddr, 0, sizeof(servAddr));
  24. servAddr.sin_family=AF_INET;
  25. servAddr.sin_addr.s_addr=inet_addr(argv[1]);
  26. servAddr.sin_port=htons(atoi(argv[2]));
  27. if(connect(hSocket, (SOCKADDR*)&servAddr, sizeof(servAddr))==SOCKET_ERROR)
  28. ErrorHandling("connect() error!");
  29. while(readLen=recv(hSocket, &message[idx++], 1, 0))
  30. {
  31. if(readLen==-1)
  32. ErrorHandling("read() error!");
  33. strLen+=readLen;
  34. }
  35. printf("Message from server: %s \n", message);
  36. printf("Function read call count: %d \n", strLen);
  37. closesocket(hSocket);
  38. WSACleanup();
  39. return 0;
  40. }
  41. void ErrorHandling(char* message)
  42. {
  43. fputs(message, stderr);
  44. fputc('\n', stderr);
  45. exit(1);
  46. }
  47. 1
  48. 2
  49. 3
  50. 4
  51. 5
  52. 6
  53. 7
  54. 8
  55. 9
  56. 10
  57. 11
  58. 12
  59. 13
  60. 14
  61. 15
  62. 16
  63. 17
  64. 18
  65. 19
  66. 20
  67. 21
  68. 22
  69. 23
  70. 24
  71. 25
  72. 26
  73. 27
  74. 28
  75. 29
  76. 30
  77. 31
  78. 32
  79. 33
  80. 34
  81. 35
  82. 36
  83. 37
  84. 38
  85. 39
  86. 40
  87. 41
  88. 42
  89. 43
  90. 44
  91. 45
  92. 46
  93. 47
  94. 48
  95. 49
  96. 50
  97. 51
  98. 52
  99. 53
  100. 54
  101. 55
  102. 56
  103. 57
  104. 58

2.3、Windows运行示例:

以VS2013为例,新建项目两个项目,将代码复制到源文件,都添加链接库:ws2_32.lib
属性->配置属性->输入->附加依赖项
这里写图片描述

输入命令参数如图:
属性->配置属性->调试
这里写图片描述
服务器项目命令参数输入:9190
客户端项目命令参数输入:127.0.0.1 9190
运行结果与Linux类似

发表评论

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

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

相关阅读