• C++网络编程之,客户连接服务器,并向服务器发信息,服务器接收信息,当输入End两者全关闭。如果两者需要相互收和发信息,需要掌握多线程。


    C++网络编程之,客户连接服务器,并向服务器发信息,服务器接收信息,当输入End两者全关闭。

    如果两者需要相互收和发信息,需要掌握多线程。

    1. //tcpSocket.h
    2. #pragma once
    3. #ifndef _TCPSOCKET_H_
    4. #define _TCPSOCKET_H_
    5. #define _CRT_NONSTDC_NO_WARNINGS
    6. #define _WINSOCK_DEPRECATED_NO_WARNINGS
    7. #include
    8. #include
    9. //网络编程,要引用这两个
    10. #include
    11. #pragma comment(lib, "ws2_32.lib")
    12. //后续的连接端口,0~65535,但是在定义时建议使用10000以上的端口,因为存在端口保留和占用的情况
    13. #define PORT 65533
    14. //定义一个err函数,方便后续debug时根据最后的错误获取信息
    15. #define err(errMsg) printf("[line: %d]%s failed code %d\n", __LINE__, errMsg, WSAGetLastError())//该函数用来获取WSA最后发生错误的代码
    16. using namespace std;
    17. //打开网络库
    18. bool init_Socket();
    19. //关闭网络库
    20. bool close_Socket();
    21. //创建服务端socket
    22. SOCKET CreatServerScoket();
    23. //创建客户端socket
    24. SOCKET CreatClientScoket(const char* ip);
    25. #endif // !_TCPSOCKET_H
    26. //tcpSocket.cpp
    27. #include "tcpSocket.h"
    28. bool init_Socket()
    29. {
    30. WSADATA data;
    31. if (WSAStartup(MAKEWORD(2, 2), &data) != 0)
    32. //Windows socket async :Windows异步套接字,使用前必须要对其进行初始化
    33. {
    34. err("WSAStartup");
    35. return false;
    36. }
    37. return true;
    38. }
    39. bool close_Socket()
    40. {
    41. if (WSACleanup() != 0)
    42. //使用完了要关闭网络库
    43. {
    44. err("WSACleanup");
    45. return false;
    46. }
    47. return true;
    48. }
    49. SOCKET CreatServerScoket()
    50. {
    51. //1、创建空的socket
    52. /*
    53. parm1:AF 地址协议族 IPv4, IPv6
    54. parm2:type 地址协议类型 流式套接字, 数据报
    55. parm3:protocol 使用具体的某个传输协议
    56. */
    57. SOCKET fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    58. if (fd == INVALID_SOCKET)
    59. {
    60. err("SOCKET");
    61. }
    62. //2、绑定ip地址和端口号
    63. struct sockaddr_in addr;
    64. addr.sin_family = AF_INET;//和创建时要一样
    65. addr.sin_port = htons(PORT); //把主机字节顺序转换为网络字节顺序
    66. addr.sin_addr.S_un.S_addr = ADDR_ANY;//inet_addr("127.0.0.1")
    67. if (bind(fd, (struct sockaddr*)&addr, sizeof(addr)) == SOCKET_ERROR)
    68. {
    69. err("bind");
    70. return false;
    71. }
    72. //3、监听电话:
    73. listen(fd, 10);
    74. return fd;
    75. }
    76. SOCKET CreatClientScoket(const char* ip)
    77. {
    78. //1、创建空的socket
    79. /*
    80. parm1:AF 地址协议族 IPv4, IPv6
    81. parm2:type 地址协议类型 流式套接字, 数据报
    82. parm3:protocol 使用具体的某个传输协议
    83. */
    84. SOCKET fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    85. if (fd == INVALID_SOCKET)
    86. {
    87. err("SOCKET");
    88. }
    89. //2、绑定ip地址和端口号
    90. struct sockaddr_in addr;
    91. addr.sin_family = AF_INET;//和创建时要一样
    92. addr.sin_port = htons(PORT); //把主机字节顺序转换为网络字节顺序
    93. addr.sin_addr.S_un.S_addr = inet_addr(ip);
    94. //3、与服务器建立连接
    95. if (connect(fd, (struct sockaddr*)&addr, sizeof(addr)) == INVALID_SOCKET)
    96. {
    97. err("connect");
    98. return false;
    99. }
    100. return fd;
    101. }

    1. //Server.cpp
    2. #include"tcpSocket.h"
    3. int main()
    4. {
    5. init_Socket();//初始化网络库
    6. SOCKET serfd = CreatServerScoket();//创建服务端socket
    7. cout << "wait client connect...\n";
    8. SOCKET clifd = accept(serfd, NULL, NULL); //如果有客户端请求连接
    9. if (clifd == INVALID_SOCKET)//失败就输出如下错误
    10. {
    11. err("accept");
    12. }
    13. char buf[BUFSIZ * 2] = { 0 };//定义接收缓冲区并初始化
    14. while (1)
    15. {
    16. if (recv(clifd, buf, BUFSIZ, 0) > 0)//接受并输出
    17. {
    18. if (strcmp(buf, "End") == 0)
    19. break;
    20. cout << buf << endl;
    21. memset(buf, 0, sizeof(buf));//缓冲区初始化,防止后续重复输出
    22. }
    23. }
    24. close_Socket();
    25. return 0;
    26. }
    27. //Client.cpp
    28. #include"tcpSocket.h"
    29. int main()
    30. {
    31. init_Socket();//创建客户端socket
    32. //SOCKET fd = CreatClientScoket("127.0.0.1");//连接
    33. SOCKET fd = CreatClientScoket("192.168.0.10");//连接
    34. char str[] = "connect success";//连接成功
    35. send(fd, str, strlen(str), 0);
    36. while (1)
    37. {
    38. char buf[1024];
    39. std::cin.getline(buf,1024);
    40. send(fd, buf, strlen(buf), 0);
    41. if (strcmp(buf, "End") == 0)
    42. break;
    43. }
    44. closesocket(fd);//关闭客户端socket
    45. close_Socket();//WSACleanup
    46. }

  • 相关阅读:
    基于JAVA、Web的农产品销售管理系统(附源码&视频&资料&数据库&教程视频&文档)
    学会这三款软件,可以轻松完成录音转文字操作
    Vue2【watch 侦听器、计算属性、axios、vue-cli、vue 组件】
    如何理解发明和实用新型具备的实用性?
    题目 1057: 二级C语言-分段函数
    [开源项目]可观测、易使用的SpringBoot线程池
    SpringBoot 通过注解给属性添加校验并返回统一结果
    乐鑫的ESP32-S3芯片的LE能实现beacon功能吗?
    Windows11家庭版没有本地组策略编辑器解决
    面向对象——抽象类
  • 原文地址:https://blog.csdn.net/laocooon/article/details/126882902