C++之基于Winsock2封装UDPServer与UDPClient

文章目录

    • Socket过程
    • UDPServer.h
    • UDPServer.cpp
    • UDPClient.h
    • UDPClient.cpp
    • main.cpp
    • CMakeLists.txt
    • 测试截图

Socket过程

  • UDPServer

  • UDPClient

UDPServer.h

#ifndef UDPSERVER_H_INCLUDED
#define UDPSERVER_H_INCLUDED#include <iostream>
#include <string>
#include <Winsock2.h>class UDPServer
{
private:WORD sockVersion;WSADATA wsaData;SOCKET udpSocket;sockaddr_in localAddr;sockaddr_in remoteAddr; // Clientconst int MSG_SIZE = 1024;public:UDPServer();~UDPServer();void Bind(u_short port);void Receive();bool Send(std::string message);
};#endif // UDPSERVER_H_INCLUDED

UDPServer.cpp

#include "UDPServer.h"UDPServer::UDPServer()
{sockVersion = MAKEWORD(2, 2);WSAStartup(sockVersion, &wsaData);udpSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
}UDPServer::~UDPServer()
{closesocket(udpSocket);WSACleanup();
}void UDPServer::Bind(u_short port)
{localAddr.sin_family = AF_INET;localAddr.sin_port = htons(port);// localAddr.sin_addr.S_un.S_addr = INADDR_ANY; // 0.0.0.0localAddr.sin_addr.S_un.S_addr = inet_addr("0.0.0.0");bind(udpSocket, (const sockaddr *)&localAddr, sizeof(localAddr));
}void UDPServer::Receive()
{while (true){char recvBuffer[MSG_SIZE];int localAddrSize = sizeof(localAddr);int lenRemoteAddr = sizeof(remoteAddr);int len = recvfrom(udpSocket, recvBuffer, MSG_SIZE, 0, (SOCKADDR *)&remoteAddr, &lenRemoteAddr);if (len > 0){recvBuffer[len] = '\0';std::cout << "[" << inet_ntoa(remoteAddr.sin_addr) << ":" << remoteAddr.sin_port << "] -> " << recvBuffer << std::endl;}}
}bool UDPServer::Send(std::string message)
{int ret = sendto(udpSocket, message.c_str(), message.length(), 0, (sockaddr *)&remoteAddr, sizeof(remoteAddr));if (ret == SOCKET_ERROR){return false;}else{return true;}
}

UDPClient.h

#ifndef UDPCLIENT_H_INCLUDED
#define UDPCLIENT_H_INCLUDED#include <iostream>
#include <string>
#include <Winsock2.h>class UDPClient
{
private:WORD sockVersion;WSADATA wsaData;SOCKET udpSocket;sockaddr_in localAddr;sockaddr_in remoteAddr; // Clientconst int MSG_SIZE = 1024;public:UDPClient();~UDPClient();void Bind(std::string ip, u_short port);void Receive();bool Send(std::string message);
};#endif // UDPCLIENT_H_INCLUDED

UDPClient.cpp

#include "UDPClient.h"UDPClient::UDPClient()
{sockVersion = MAKEWORD(2, 2);WSAStartup(sockVersion, &wsaData);udpSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
}UDPClient::~UDPClient()
{closesocket(udpSocket);WSACleanup();
}void UDPClient::Bind(std::string ip, u_short port)
{localAddr.sin_family = AF_INET;localAddr.sin_port = htons(port);localAddr.sin_addr.S_un.S_addr = INADDR_ANY; // 0.0.0.0remoteAddr = localAddr;remoteAddr.sin_addr.S_un.S_addr = inet_addr(ip.c_str());bind(udpSocket, (const sockaddr *)&localAddr, sizeof(localAddr));Send("Hello");
}void UDPClient::Receive()
{while (true){char recvBuffer[MSG_SIZE];int localAddrSize = sizeof(localAddr);int lenRemoteAddr = sizeof(remoteAddr);int len = recvfrom(udpSocket, recvBuffer, MSG_SIZE, 0, (SOCKADDR *)&remoteAddr, &lenRemoteAddr);if (len > 0){recvBuffer[len] = '\0';std::cout << "[" << inet_ntoa(remoteAddr.sin_addr) << ":" << remoteAddr.sin_port << "] -> " << recvBuffer << std::endl;}}
}bool UDPClient::Send(std::string message)
{int ret = sendto(udpSocket, message.c_str(), message.length(), 0, (sockaddr *)&remoteAddr, sizeof(remoteAddr));if (ret == SOCKET_ERROR){return false;}else{return true;}
}

main.cpp

#include <iostream>
#include <thread>
#include <string>#include "UDPClient.h"
#include "UDPServer.h"int main()
{std::cout << "[0] -> UDPServer"<< "\n"<< "[1] -> UDPClient" << std::endl;u_int flag = 2;std::cin >> flag;switch (flag){case 0:{std::cout << "[UDPServer] -> Start" << std::endl;UDPServer udpServer;udpServer.Bind(6789);std::thread recvThread(&UDPServer::Receive, &udpServer);// 主线程while (true){std::cout << "\n[Input] -> ";std::string msg;std::cin >> msg;if (udpServer.Send(msg)){std::cout << "[UDPServer] -> " << msg << std::endl;}else{std::cout << "[ErrorCode] -> " << GetLastError() << std::endl;}}// 等待线程结束recvThread.join();std::cout << "[UDPServer] -> Stop" << std::endl;break;}case 1:{std::cout << "[UDPClient] -> Start" << std::endl;UDPClient udpClient;udpClient.Bind("127.0.0.1", 6789);std::thread recvThread(&UDPClient::Receive, &udpClient);// 主线程while (true){std::cout << "\n[Input] -> ";std::string msg;std::cin >> msg;if (udpClient.Send(msg)){std::cout << "[UDPClient] -> " << msg << std::endl;}else{std::cout << "[ErrorCode] -> " << GetLastError() << std::endl;}}// 等待线程结束recvThread.join();std::cout << "[UDPClient] -> Stop" << std::endl;break;}default:break;}system("pause");return 0;
}

CMakeLists.txt

cmake_minimum_required(VERSION 3.0.0)
project(UDPProtocol VERSION 0.1.0 LANGUAGES CXX)add_executable(${PROJECT_NAME} UDPClient.cppUDPServer.cppmain.cpp)if(WIN32)target_link_libraries(${PROJECT_NAME} PRIVATE ws2_32)
endif()

测试截图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/107920.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SAP-FI模块 处理自动生成会计凭证增强

2、固定资产业务过渡科目摘要增强功能-MIGO ENHANCEMENT 2 ZEHENC_SAPMF05A. "active version * FI 20221215&#xff1a;固定资产业务过渡科目摘要增强功能 WAIT UP TO 1 SECONDS.READ TABLE xbseg WITH KEY hkont 1601990001. IF sy-subrc 0.DATA: lt_bkdf TYPE …

flink教程

文章目录 来自于尚硅谷教程1. Flink概述1.1 特点1.2 与SparkStreaming对比 2. Flink部署2.1 集群角色2.2 部署模式2.3 Standalone运行模式2.3.1 本地会话模式部署2.3.2 应用模式 2.4 YARN运行模式2.4.1 会话模式部署2.4.2 应用模式部署 2.5 历史服务 3. 系统架构3.1 并行度3.2 …

【C++】缺省参数与函数重载

&#x1f440;樊梓慕&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》 &#x1f31d;每一个不曾起舞的日子&#xff0c;都是对生命的辜负 前言 本篇文章博主将带你学习缺省参数与函数重载&…

.Net Core 6 运行环境手动安装流程

安装.NET Core 6 概述 在开始之前&#xff0c;我们首先需要了解一下整个安装过程的流程。下面的表格将展示安装.NET Core 6的步骤以及每一步需要做的事情。 步骤 动作 说明 1 下载.NET Core 6 SDK 从官方网站下载.NET Core 6 SDK安装包 2 安装.NET Core 6 SDK …

win10如何取消文件夹分组

问题描述 最近不知道把哪里碰了&#xff0c;win10文件夹显示的文件都是按照日期分组了&#xff0c;很讨厌。如下图所示 修改方法 1、文件夹空白处-右击 2、分组依据(P)-选择(无)(N) 下面是操作好之后的效果图 结束 -----华丽的分割线&#xff0c;以下是凑字数&#xff0c;大…

超声波清洗机需要注意什么?不能错过的超声波清洗机

超声波清洗机在当今社会已经越来越受到人们的欢迎&#xff0c;它利用超声波的振动来清洁物品表面&#xff0c;能够快速、高效地清除污垢、油脂等。但是&#xff0c;在购买超声波清洗机时&#xff0c;需要注意哪些问题呢&#xff1f;本文将为您介绍购买超声波清洗机需要注意的几…

2023/10/15总结

学习总结 最近开始写项目了&#xff0c;然后写的过程中遇到了跨域问题。 为什么会出现跨域问题 由于浏览器的同源策略限制。同源策略是一种约定&#xff0c;它是浏览器最核心也是最基本的安全功能。如果缺少了同源策略&#xff0c;那么浏览器的正常功能可能都会收到影响。所谓…

hash join的基本原理是怎样的?

我们知道数据库里面两表关联主要有三种常见的关联方式&#xff0c;即 nested loop joinhash joinmerge join nested loop join在OLTP交易场景占比是最多的&#xff0c;常用于关联字段为主键或索引字段的情况&#xff0c;通过主键或索引以及loop的方式&#xff0c;A表可以快速…

【特纳斯电子】基于单片机的火灾监测报警系统-仿真设计

视频及资料链接&#xff1a;基于单片机的火灾监测报警系统-仿真设计 - 电子校园网 (mcude.com) 编号&#xff1a; T0152203M-FZ 设计简介&#xff1a; 本设计是基于单片机的火灾监测报警系统&#xff0c;主要实现以下功能&#xff1a; 1.通过OLED显示温度、烟雾、是否有火…

摩尔信使MThings的设备高级参数

摩尔信使MThings支持三级参数管理方案&#xff0c;依次为&#xff1a;数据级、设备级、通道级。 设备级参数不仅包含设备名称、设备地址等常用信息&#xff0c;同时提供了诸多高级参数&#xff0c;其同样是为了满足不同用户应用场景中所面临的差异化需求&#xff0c;以更加灵活…

JAVAEE初阶相关内容第十四弹--网络初识

写在前&#xff1a; 这一部分开启网络部分的相关知识&#xff0c;这一弹内容初始网络将主要进行网络相关知识的简单介绍&#xff0c;以及着重介绍协议、协议分层、OSI七层模型、TCP/IP五层模型、封装和分用。 需要认识协议&#xff0c;并知道协议的效果是什么&#xff1b;知道…

word如何设置页码?教你快速提升文档颜值!

在创建文档时&#xff0c;为了更好地组织内容&#xff0c;页码是一个必不可少的元素。但是很多人不知道word如何设置页码&#xff0c;其实word提供了多种设置页码的方法&#xff0c;以满足不同文档的需求。本文将详细介绍3种设置页码的方法&#xff0c;无论您是初学者还是有经验…

LMI FocalSpec 3D线共焦传感器 使用笔记1

一.硬件介绍 以上特别注意: 屏蔽线必须接地,因为在现场实际调试中,使用软件调试发现经常 弹窗 传感器丢失警告!! 以上 Position LED 的灯被钣金挡住,无法查看异常现象,能否将指示灯设置在软件界面上? 需要确认是软触发还是硬触发,理论上 硬触发比软触发速度要快.(我们目前使用…

LinkedList集合

LinkedList集合 底层数据结构是双链表,查询慢,增删快,但如果操做的是首元素,速度也是极快的 本身多了很多直接操做首尾元素的特有API 这些特有方法不常用,了解即可 LinkedList源码分析 迭代器的源码分析 iterator():生成一个迭代器对象,默认指向集合的0索引处hasNext():判…

sqlserver系统存储过程添加用户学习

sqlserver有一个系统存储过程sp_adduser&#xff1b;从名字看是添加用户的&#xff1b;操作一下&#xff0c; 从错误提示看还需要先添加一个登录名&#xff0c;再执行一个系统过程sp_addlogin看一下&#xff0c; 执行完之后看一下&#xff0c;安全性-登录名下面有了rabbit&…

【JavaEE】初识网络

网络初识 文章目录 网络初识网络发展史独立模式网络互连局域网LAN广域网 网络通信基础IP地址端口号格式 协议五元组协议分层OSI七层模型TCP/IP五&#xff08;四&#xff09;层协议1.物理层2.数据链路层3.网络层4.传输层5.应用程序 网络设备所在的分层封装和分用例子发送方接收方…

ERP系统供应商协同:优化企业供应链管理

一、ERP系统供应商协同的概念和功能 供应商协同是指在供应链中&#xff0c;企业与供应商之间通过ERP系统进行紧密合作和信息共享&#xff0c;实现供应链各个环节的协调和优化。ERP系统供应商协同功能涉及以下方面&#xff1a; 1. 供应商管理&#xff1a;ERP系统提供完善的供应…

el-table添加fixed属性后底部滚动条添加小手

0 效果 1 样式 /deep/ .el-table--scrollable-x {cursor: pointer; } /deep/ .el-table__empty-block {cursor: auto; } /deep/ .el-table__row {cursor: auto; }

深入剖析 深度学习中 __init()__函数和forward()函数

目录 前言1. __init()__函数2. forward()函数3. 两者关系 前言 再看代码时&#xff0c;发现init函数和forward函数都有参数&#xff0c;具体是怎么传参的呢&#xff1f; 为了更方便的讲解&#xff0c;会举简单的代码例子结合讲解。 forward() 和 __init__() 是神经网络模型类…

13-k8s-ingress网络

文章目录 一、ingress介绍二、创建nginx和tomcat供测试三、创建ingress-http四、yaml方式安装ingress五、helm方式安装ingress&#xff08;推荐&#xff09;六、Ingress的HTTPS代理 一、ingress介绍 Service对集群之外暴露服务的主要方式有两种&#xff1a;NotePort和LoadBalan…