• C++ UDP通信


    1. #pragma once
    2. #ifndef XUDP_H
    3. #define XUDP_H
    4. #ifdef WIN32
    5. #include
    6. #define socklen_t int
    7. #else
    8. #include
    9. #define closesocket close //替换close函数
    10. #include
    11. #include
    12. #endif
    13. class XUdp
    14. {
    15. public:
    16. int CreateSocket(); // 1 创建套接字
    17. bool Bind(); // 2 绑定并监听端口号
    18. int Send(const char* buf, int size, char* ip, unsigned short port); //3 发送数据
    19. int Recv(char* buf, int bufsize, sockaddr_in* from); // 4 接收数据
    20. void Close(); // 5 关闭连接
    21. int SetRecvTimeout(int sec); //设置udp接收超时
    22. int SetSendTimeout(int sec); //设置udp发送超时
    23. XUdp(unsigned short port = 9000);
    24. virtual ~XUdp();
    25. private:
    26. int usock = 0; //udp服务端的socket create成员函数自己生成
    27. unsigned short uport = 0; //构造函数从外获取
    28. };
    29. #endif
    1. #include "XUdp.h"
    2. #include //IO流操作
    3. #include //string标准库
    4. #ifdef WIN32
    5. #include
    6. #define socklen_t int
    7. #else
    8. #include
    9. #define closesocket close //替换close函数
    10. #include
    11. #include
    12. #endif
    13. XUdp::XUdp(unsigned short port)
    14. {
    15. //初始化动态链接库
    16. //引用lib库
    17. #ifdef WIN32 //linux下不用初始化网络库
    18. static bool first = true;
    19. if (first)
    20. {
    21. first = false; //只在首次进入时初始化网络库
    22. WSADATA ws; //加载Socket库 项目属性-链接器-输入加上 ws2_32.lib
    23. WSAStartup(MAKEWORD(2, 2), &ws); //动态库引用加1
    24. }
    25. #endif
    26. uport = port;
    27. printf("port:%d connect ! \n",port);
    28. }
    29. XUdp::~XUdp()
    30. {
    31. //delete this;
    32. }
    33. int XUdp::CreateSocket() //创建套接字
    34. {
    35. usock = socket(AF_INET, SOCK_DGRAM, 0); //TCP/IP UDP 创建udp 套接字
    36. if (usock == -1)
    37. {
    38. printf("create udp socket failed.\n");
    39. return -1;
    40. }
    41. printf("create udp socket success.\n");
    42. return 0;
    43. }
    44. void XUdp::Close() //关闭连接
    45. {
    46. if (usock <= 0) return; //socket出错
    47. closesocket(usock); //已宏定义
    48. usock = 0;
    49. uport = 0;
    50. }
    51. bool XUdp::Bind() //绑定并监听端口号
    52. {
    53. sockaddr_in saddr; //数据结构
    54. saddr.sin_family = AF_INET; //协议
    55. saddr.sin_port = htons(uport); //端口,主机字节序(小端方式)转换成网络字节序(大端方式)
    56. // saddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    57. saddr.sin_addr.s_addr = htonl(INADDR_ANY); //绑定IP到广播地址INADDR_ANY 0.0.0.0 为了兼容linux
    58. if (bind(usock, (sockaddr*)&saddr, sizeof(saddr)) != 0) //安装sockaddr_in数据结构绑定套接字
    59. {
    60. printf("udp bind port %d failed.\n", uport);
    61. return false;
    62. }
    63. printf("udp bind port %d success.\n", uport);
    64. return true;
    65. }
    66. int XUdp::Send(const char* buf, int size, char* ip, unsigned short port) //发送数据(强制全部发送)
    67. {
    68. int sendedSize = 0; //已发送成功的长度
    69. sockaddr_in saddr;
    70. saddr.sin_family = AF_INET; //tcp/ip协议
    71. saddr.sin_port = htons(port);//服务端的端口 主机字节序转换成网络字节序
    72. saddr.sin_addr.s_addr = inet_addr(ip); //本机的ip地址 字符串ip地址转成整型
    73. while (sendedSize != size) //若没发送完成,则从断点开始继续发送 直到完成
    74. {
    75. int len = sendto(usock, buf + sendedSize, size - sendedSize, 0, (sockaddr*)&saddr, sizeof(saddr));
    76. if (len <= 0)break;
    77. sendedSize += len;
    78. }
    79. return sendedSize;
    80. }
    81. int XUdp::Recv(char* buf, int bufsize, sockaddr_in* from) //接收数据
    82. {
    83. socklen_t len = sizeof(sockaddr_in);
    84. int re = recvfrom(usock, buf, bufsize, 0, (sockaddr*)from, &len); //返回接收的客户端的网络地址,存在在地址中
    85. return re;
    86. }
    87. int XUdp::SetRecvTimeout(int sec = 1) //设置udp接收超时
    88. {
    89. #ifdef WIN32
    90. int udp_rev_time = sec * 1000;
    91. if (setsockopt(usock, SOL_SOCKET, SO_RCVTIMEO, (char*)&udp_rev_time, sizeof(int)) < 0)
    92. {
    93. printf("set udp receive failed.\n");
    94. return -1;
    95. }
    96. printf("set udp recv timeout success. %d seconds\n", sec);
    97. return 0;
    98. #else
    99. struct timeval udp_rev_time;
    100. udp_rev_time.tv_sec = sec;
    101. udp_rev_time.tv_usec = 0;
    102. if (setsockopt(usock, SOL_SOCKET, SO_RCVTIMEO, (char*)&udp_rev_time, sizeof(udp_rev_time)) < 0)
    103. {
    104. printf("set udp receive failed.\n");
    105. return -1;
    106. }
    107. printf("set udp recv timeout success. %d seconds\n", sec);
    108. return 0;
    109. #endif
    110. }
    111. int XUdp::SetSendTimeout(int sec = 1) //设置udp发送超时
    112. {
    113. #ifdef WIN32
    114. int udp_rev_time = sec;
    115. if (setsockopt(usock, SOL_SOCKET, SO_SNDTIMEO, (char*)&udp_rev_time, sizeof(int)) < 0)
    116. {
    117. printf("set udp send failed.");
    118. return -1;
    119. }
    120. return 0;
    121. printf("set udp send timeout success. %d seconds\n", sec);
    122. #else
    123. struct timeval udp_rev_time;
    124. udp_rev_time.tv_sec = sec;
    125. udp_rev_time.tv_usec = 0;
    126. if (setsockopt(usock, SOL_SOCKET, SO_SNDTIMEO, (char*)&udp_rev_time, sizeof(udp_rev_time)) < 0)
    127. {
    128. printf("set udp send failed.");
    129. return -1;
    130. }
    131. printf("set udp send timeout success. %d seconds\n", sec);
    132. return 0;
    133. #endif
    134. }

     接收:
     

    1. #include"XUdp.h"
    2. #include
    3. int main()
    4. {
    5. XUdp xudp(6000); // 绑定端口
    6. xudp.CreateSocket(); //
    7. int r = xudp.Bind();
    8. if (r == -1)
    9. {
    10. printf("绑定失败:%d\n",GetLastError());
    11. xudp.Close();
    12. }
    13. char buff[256];
    14. int buffsize = sizeof(buff);
    15. SOCKADDR_IN client;
    16. while (1)
    17. {
    18. int re = xudp.Recv(buff,buffsize, &client);
    19. if (re != -1)
    20. {
    21. printf("recv_len = >%d \n", re);
    22. buff[re] = 0;
    23. printf("recv: %s \n",buff);
    24. }
    25. }
    26. system("pause");
    27. return 0;
    28. }

    发送创建

    1. #include"client.h"
    2. #include
    3. #include
    4. int main()
    5. {
    6. XUdp xudp(6000);
    7. xudp.CreateSocket();
    8. int r = xudp.Bind();
    9. if (r == -1)
    10. {
    11. printf("绑定失败:%d\n", GetLastError());
    12. xudp.Close();
    13. }
    14. char buff[256];
    15. char ip[16];
    16. strcpy_s(ip,"127.0.0.1");
    17. while (1)
    18. {
    19. memset(buff,0,256);
    20. printf("send:");
    21. scanf_s("%s",buff,sizeof(buff));
    22. xudp.Send(buff,strlen(buff),ip, 6000);
    23. }
    24. system("pause");
    25. return 0;
    26. }

  • 相关阅读:
    面试官:设计一个异步并发限制吧
    EFCore学习笔记(2)——实体类型
    linux 编译 llvm + clang
    MPU进化,多核异构处理器有多强?A核与M核通信过程解析
    数据库理论 06 存储管理和索引——基于《数据库系统概念》第七版
    [NISACTF 2022]checkin
    283. 多边形,《算法竞赛进阶指南》,
    传统行业+NFT然后迎来新增长点?
    《对比Excel,轻松学习Python数据分析》读书笔记------数据运算
    珍藏的javafx教程——简单了解
  • 原文地址:https://blog.csdn.net/qq_42046837/article/details/133894852