基于libuv封装UDP,支持ipv4和ipv6,支持接收和发送
仓库地址
特点
- 支持IPV4 和 ipv6
- 支持UDP 组播、单播、 广播
使用流程
- 初始化
- 发送 | 接收
- 退出
一个范例
例子可在example目录下main.cc中找到
1. 创建
pudp = lib_commu::NewUDP();
2.1 初始化
UDPInit param;
int uni_or_multi = 0;
std::cout << "1-multi, 0 -uni:";
std::cin >> uni_or_multi;
if (1 == uni_or_multi)
{
/// 组播
param.cast_type_ = CT_MULTI;
param.dest_ip_ = std::string("233.0.0.212");
}
else
{
/// 单播
param.cast_type_ = CT_UNI;
param.dest_ip_ = std::string("10.0.0.6");
}
param.local_ip_ = std::string("10.0.0.6");
param.dest_port_ = 27500;
param.socket_ver_ = SOCKET_VERSION_4;
/// 初始化
int ret = pudp->Init(param);
if (0 != ret)
{
///
std::cout << "\n\n init_failed =" << ret << "\n\n";
}
else
{
/// 成功
}
2.2 接收
- 如果需要接收数据, 将2.1中param的成员变量指向icommunication.h中的IDataDispatch类的对象
- 下面的演示代码中, NetUDP 继承了IDataDispatch 并实现了RecvData函数,所以,赋值使用如下:
param.recv_data_ = this;
3. 发送数据
/// 发送数据
char arr[] = "1234567890";
/// 循环发送
for (int index = 0; index < 6; ++index)
{
ret = pudp->Send(arr, strlen(arr));
if (0 != ret)
{
std::cout << "\n\n send_failed, ret =" << ret << "\n\n";
}
else
{
/// 发送成功
std::cout << "\n\n send_success\n\n";
}
std::this_thread::sleep_for(std::chrono::milliseconds(100));
}
4. 接收数据
应用层接收数据需要继承icommunication.h中的IDataDispatch类, 当底层收到数据后, 调用该函数
/// ----------------------------------------------------------------------------------------
/// @brief: 继承 IDataDispatch 实现数据接收与发送结合
/// ----------------------------------------------------------------------------------------
class NetUDP : public lib_commu::IDataDispatch, public lib_commu::SendResultNotify
{
public:
/// --------------------------------------------------------------------------------
/// @brief: RecvData
/// --------------------------------------------------------------------------------
virtual int RecvData(const char* pdata, const size_t len) override
{
//throw std::logic_error("The method or operation is not implemented.");
std::cout << "\n rec vdata =";
for (size_t index = 0; index < len; ++index)
{
std::cout << pdata[index] << " ";
}
return 0;
}
}
更新日志
18/07/2022
- 重构初始化接口你Init, 将接收数据对象放入结构体中
- 增加发送结果通知函数, 应用层可继承实现,
- 增加发送缓冲 send_event_buf_, 改为创建10个, 当发送数据时,从这里获取, 如果event不够,则返回6(先前是,当发送数据时,创建UvEVent对象, 发送结束,再释放,改为初始化申请一段内存,避免频繁申请内存空间和释放)
- BUG: send_event_buf_ 需要增加互斥, 待完成(因为发送线程和回调线程都会访问该缓冲区)
16/07/2022
- 重构底层发送和接收 改为使用 LIBUV
- libuv使用的时VS2015 编译的64位, 后期改为使用源码
- 目前仅能支持windows, 后期改为支持linux等多平台
- 参考TestLibuv 做了封装
11/06/2021
- 增加IPV6
- ipv6通过windows10初步测试
3.ipv6包括: 接收和发送
5.增加错误代码接口
30/05/2021
1.增加IPv6,待测
2.全部改为Unicode编码, 无签名
23-05-2021
1.模块内部增加优化
15/12/2020
- cmake重新配置,改为支持modern cmake
- 创建cmake文件夹,并创建spdlog.cmake文件
- 类的成员函数和成员变量重命名
11/06/2021
- 增加IPV6
- ipv6通过windows10初步测试
3.ipv6包括: 接收和发送
5.增加错误代码接口
30/05/2021
1.增加IPv6,待测
2.全部改为Unicode编码, 无签名