libhv vs2019 udp简单的实例

项目依赖头文件与库文件之后

(1)服务端

// HttpServerDemo.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。

//

using namespace hv;

#include <string>

#include <vector>

#include "hv/hv.h"

using namespace std;

#include "hv/UdpServer.h"

#include <iostream>

using namespace hv;

#pragma pack(push, 1)

enum PacketType {

LOGIN = 1, // 登录

LOGOUT = 2, // 退出

USER_DATA = 3 // 自定义结构体数据

};

struct LoginMsgData

{

uint32_t type;

char user32;

char pwd32;

};

struct LogoutMsgData

{

uint32_t type;

int nId;

};

// 主机字节序 → 网络字节序

static inline uint32_t hton_u32(uint32_t value) {

return htonl(value);

}

static inline uint32_t get_u32(const void* data) {

return ntohl(*(const uint32_t*)data);

}

map<int, string> mapClientUser;

int main(int argc, char* argv\[\]) {

int port = 8080;

UdpServer srv;

int bindfd = srv.createsocket(port);

if (bindfd < 0) {

return -20;

}

printf("server bind on port %d, bindfd=%d ...\n", port, bindfd);

srv.onMessage = \[\](const SocketChannelPtr& channel, Buffer* buf) {

uint32_t type = get_u32(buf->data());

switch (type)

{

case LOGIN:

{

mapClientUserchannel-\>fd() = channel->peeraddr();

printf("< 唯一标识:%d - ip地址:%s\n", channel->fd(),

channel->peeraddr().c_str());

if (buf->size() < sizeof(LoginMsgData)) return;

LoginMsgData* pkt = (LoginMsgData*)buf->data();

channel->write("login success");

break;

}

case LOGOUT:

{

printf("< 唯一标识:%d - ip地址:%s\n", channel->fd(),

channel->peeraddr().c_str());

if (buf->size() < sizeof(LogoutMsgData)) return;

channel->write("logout success");

auto itrFind = mapClientUser.find(channel->fd());

if (itrFind != mapClientUser.end())

{

mapClientUser.erase(itrFind);

}

break;

}

default:

{

printf("❌ 未知包类型\n");

break;

}

}

};

srv.start();

std::string str;

while (std::getline(std::cin, str)) {

if (str == "close") {

srv.closesocket();

}

else if (str == "start") {

srv.start();

}

else if (str == "stop") {

srv.stop();

break;

}

else {

srv.sendto(str);

}

}

return 0;

}

#pragma pack(pop)

(2)客户端

#include "hv/UdpClient.h"

#include <iostream>

#include <string>

#pragma pack(push, 1)

using namespace std;

using namespace hv;

enum PacketType {

LOGIN = 1, // 登录

LOGOUT = 2, // 退出

USER_DATA = 3 // 自定义结构体数据

};

struct LoginMsgData

{

uint32_t type;

char user32;

char pwd32;

};

struct LogoutMsgData

{

uint32_t type;

int nId;

};

static inline uint32_t hton_u32(uint32_t value) {

return htonl(value);

}

static inline uint32_t get_u32(const void* data) {

return ntohl(*(const uint32_t*)data);

}

int main(int argc, char* argv\[\]) {

int remote_port = 8080;

const char* remote_host = "127.0.0.1";

UdpClient cli;

int sockfd = cli.createsocket(remote_port, remote_host);

if (sockfd < 0) {

return -20;

}

printf("client sendto port %d, sockfd=%d ...\n", remote_port, sockfd);

cli.onMessage = \[\](const SocketChannelPtr& channel, Buffer* buf) {

printf("< %s\n", (char*)buf->data());

};

cli.start();

{

LoginMsgData login{};

login.type = hton_u32(PacketType::LOGIN);

strcpy(login.user, "admin");

strcpy(login.pwd, "123456");

cli.sendto(&login, sizeof(login));

}

{

LogoutMsgData _logout{};

_logout.type = hton_u32(PacketType::LOGOUT);

_logout.nId = 123;

cli.sendto(&_logout, sizeof(_logout));

}

std::string str;

while (std::getline(std::cin, str)) {

if (str == "close") {

}

else if (str == "start") {

}

else if (str == "stop") {

}

else {

}

}

return 0;

}

#pragma pack(pop)

至此,一个简单的udp服务器端与客户端的demo完成

相关推荐
2601_949499941 小时前
芯瑞科技 DT-1414 光模块工程实测:完美兼容博通(安华高) HFBR-1414PTZ,VCSEL 替代方案
大数据·网络·人工智能·科技·光模块
2501_915918412 小时前
iOS 怎么抓包?抓包鹰系统级 网卡 应用层三种方式对比,不越狱抓 iPhone 流量
网络协议·计算机网络·网络安全·ios·adb·https·udp
云边云科技_云网融合2 小时前
连锁门店 POS、监控、IoT 设备网络不稳定怎么解决?
网络·物联网
XR1234567883 小时前
学校宿舍区网络方案对比:多终端高并发下的认证、管理与体验
网络
March.s4 小时前
IP 存储核心 iSCSI:原理拆解 + 无报错实战指南
网络·网络协议·tcp/ip
超智算科技4 小时前
超智算领衔协办“NVIDIA创业企业展示·西安站”,全栈AI服务赋能行业生态协同发展
大数据·网络·人工智能·物联网·百度
空杆推不起5 小时前
企业数据加密实战:传输链路与存储层全场景落地指南
网络·安全·web安全
️学习的小王5 小时前
基于UDP实现简易聊天室(基础版)——Python实现
网络·python·udp
砚凝霜5 小时前
软考网络工程师|第 5 章 路由基础、静态路由、RIP、OSPF、BGP、IS-IS 完整备考笔记
网络·笔记
Kina_C6 小时前
Keepalived 配置管理进阶:使用子配置文件实现模块化与高可读性
linux·网络·keepalived