当前位置:   article > 正文

用C/C++写一个客户端和服务器之间进行TCP通信的DEMO

用C/C++写一个客户端和服务器之间进行TCP通信的DEMO

目录

一、Visual Sudio 2022

二、配置

三、说明

四、客户端

五、服务端

六、演示


一、Visual Sudio 2022

Visual Studio 2022微软公司推出的一款集成开发环境(IDE),旨在为开发人员提供全面的工具集,支持从WindowsMacOSiOSAndroid等多个平台的开发。

  1. 跨平台支持:Visual Studio 2022支持.NET MAUI(Multi-platform App UI),这是一个跨平台的UI框架,允许开发者使用C#XAML为Windows、Android、MacOS以及iOS等平台创建统一的客户端应用。此外,ASP.NET Blazor Web技术也支持通过.NET MAUI编写桌面应用程序。

  2. C++支持:Visual Studio 2022为C++工作负载提供了强大的支持,包括新的生产功能、C++ 20工具和IntelliSense,显著简化了大型代码库的管理流程,并改进了诊断功能,使得调试更易于进行。

  3. 实时协作:通过Live Share功能,开发人员可以实时共享编码会话,加快团队的编辑和调试周期。Live Share还引入了集成文本聊天功能,方便团队成员之间的沟通。

  4. AI支持:Visual Studio 2022集成了AI IntelliCode引擎,能够无缝预测开发人员的下一步操作,提高开发效率。此外,AI还支持代码完成功能,帮助开发人员更快地编写代码。

  5. 部署和测试:Visual Studio 2022简化了Azure部署流程,提供了针对常见应用程序类型的模板和本地仿真器所需的依赖项预配功能。它还支持在Windows、Linux和MacOS上进行测试,确保应用在所有平台上都能正常运行。

  6. 性能优化:Visual Studio 2022是一个64位应用程序,能够处理任何大小和复杂性的项目,而不会出现内存不足的情况。它还专注于改善搜索、Git工具和其他重要功能的性能,提高开发人员的效率。

  7. 安全性:Visual Studio 2022通过提供访问控制和自定义编辑器设置等个性化会话,确保代码的一致性和安全性。

二、配置

打开visual studio 2022的属性页面

将SDL检查设置为否 。

三、说明

将客户端与服务端分别实现,打开服务端后,进入等待连接状态,打开客户端连接成功后,提示输入信息,当输入"playmusic"后,服务器端响应播放mp3文件(自己找一个mp3文件,放到debug路径下,与exe文件在同一目录下),关闭客户端后服务器端停止工作。

四、客户端

  1. #include<iostream>
  2. #include<WinSock2.h>
  3. #pragma comment(lib,"ws2_32.lib")
  4. using namespace std;
  5. int main()
  6. {
  7. // 开启网络权限
  8. WSADATA wsaData;
  9. WSAStartup(MAKEWORD(2, 2), &wsaData);
  10. // 创建socket
  11. SOCKET client_socket = socket(AF_INET, SOCK_STREAM, 0);
  12. if (client_socket == -1)
  13. {
  14. cout << "client socket create failed !!! Error Code: " << GetLastError() << endl;
  15. exit(-1);
  16. }
  17. // 创建目标IP和端口
  18. struct sockaddr_in target;
  19. target.sin_family = AF_INET;
  20. target.sin_port = htons(8080);
  21. target.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
  22. // 直接连接
  23. if (connect(client_socket, (struct sockaddr*)&target, sizeof(struct sockaddr)) == -1)
  24. {
  25. cout << "connect server failed !!! Error Code:" << GetLastError() << endl;
  26. }
  27. // 发消息
  28. while (true)
  29. {
  30. char buff[BUFSIZ * 4] = { 0 };
  31. cout << "please input send content:" << endl;
  32. cin >> buff;
  33. int ret = send(client_socket, buff, strlen(buff), 0);
  34. if (ret <= 0)
  35. break;
  36. }
  37. return 0;
  38. }

五、服务端

  1. #include<iostream>
  2. #include<stdio.h>
  3. // winsock widows自带的
  4. #include<WinSock2.h>// Windows 网络通讯头文件
  5. // 一个库文件 (windows 不开源)
  6. #pragma comment(lib,"ws2_32.lib")
  7. // 媒体库
  8. #include<mmsystem.h>
  9. #pragma comment (lib,"winmm.lib")
  10. using namespace std;
  11. int main()
  12. {
  13. // 开启网络
  14. WSADATA wsaData;
  15. WSAStartup(MAKEWORD(2, 2), &wsaData);
  16. // TCP协议,流式协议,三次握手和四次挥手
  17. // socket套接字 IPV4/IPV6 IP TCP UDP RAW
  18. // socket(
  19. // int af, // 协议地址族 IPV4/IPV6 AF_INET/AF_INET6
  20. // int type, // 协议类型 TCP UDP RAW / SOCK_STREAM SOCK_DGRAM SOCK_RAW
  21. // int protocol // 保护方式
  22. // );
  23. SOCKET server_socket = socket(AF_INET, SOCK_STREAM, 0);
  24. if (server_socket == -1)
  25. {
  26. cout << "server socket create failed !!! Error Code:" << GetLastError << endl;
  27. exit(-1);
  28. }
  29. /*
  30. typedef struct sockaddr_in {
  31. unsigned short sin_family; // 协议地址族
  32. unsigned short sin_port; // 端口号 5000+ 8080 9090
  33. // htons() // 小端序转换成大端序
  34. IN_ADDR sin_addr; // 网卡 --> 硬件网卡 WIFI 蓝牙 虚拟网卡 0.0.0.0 表示全部都检测
  35. // 127.0.0.1 192.168.0.100
  36. // inet_addr() // 将点分十进制的IP地址转换成整数
  37. CHAR sin_zero[8]; // 保留位置,可能之后会用到的
  38. } SOCKADDR_IN, *PSOCKADDR_IN;
  39. */
  40. struct sockaddr_in local;
  41. local.sin_family = AF_INET;
  42. local.sin_port = htons(8080); // htons 返回的是是unsigned short
  43. local.sin_addr.S_un.S_addr = inet_addr("0.0.0.0");
  44. // 绑定socket和端口
  45. if (bind(server_socket, (struct sockaddr*)&local, sizeof(struct sockaddr_in)) == -1)
  46. {
  47. cout<<"bind server socket failed !!! Error Code:"<<GetLastError()<<endl;
  48. exit(-1);
  49. }
  50. // 监听端口
  51. if (listen(server_socket, 10) == -1)
  52. {
  53. cout << "listen server socket failed !!! Error Code:" << GetLastError() << endl;
  54. exit(-1);
  55. }
  56. cout << "bind and listen success. wait client connect ..." << endl;
  57. // 等待客户端的连接 accept在进行的过程中 就是三次握手
  58. // accept是一个阻塞函数
  59. SOCKET client_socket = accept(server_socket, NULL, NULL);
  60. while (true)
  61. {
  62. char buff[BUFSIZ * 4] = { 0 };
  63. // 接收数据
  64. int ret = recv(client_socket, buff, BUFSIZ * 4, 0);
  65. // recv 返回值为-1 表示出错了
  66. // recv 返回值为0 表示正常断开
  67. // recv 返回值为正数 表示接收到了多少数据
  68. if (ret <= 0) {
  69. break;
  70. }
  71. cout << "接收到多少数据:" << ret << endl;
  72. cout << "接收到的数据:" << buff << endl;
  73. if (memcmp(buff, "playmusic", strlen("playmusic")) == 0)
  74. {
  75. mciSendString(TEXT("open Back_To_Me-Vanotek-44303614.mp3"), NULL, 0, NULL);
  76. mciSendString(TEXT("play Back_To_Me-Vanotek-44303614.mp3"), NULL, 0, NULL);
  77. }
  78. }
  79. return 0;
  80. }

六、演示

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Guff_9hys/article/detail/792173
推荐阅读
相关标签
  

闽ICP备14008679号