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 user[32];

char pwd[32];

};

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:

{

mapClientUser[channel->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 user[32];

char pwd[32];

};

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完成

相关推荐
小苗卷不动2 小时前
UDP服务端收发流程
linux·c++·udp
阳光普照世界和平3 小时前
2026软件安全趋势解析:攻防迭代下,企业该如何破局?
网络·安全
被摘下的星星3 小时前
计算机网络的拓扑结构
网络·计算机网络
positive_zpc3 小时前
计算机网络——数据链路层(一)
网络·计算机网络
孙同学_3 小时前
【Linux篇】详解TCP/UDP传输层协议:全面拆解三次握手、四次挥手及可靠性机制
linux·tcp/ip·udp
Chengbei114 小时前
2026护网HVV面试看这篇就够了!真题+技巧+培训福利一站式get
网络·安全·web安全·网络安全·面试·职场和发展·安全架构
格林威4 小时前
如何用 eBPF 监控 GigE Vision 相机网络性能
网络·人工智能·数码相机·yolo·计算机视觉·视觉检测·工业相机
Tockm4 小时前
vm网络配置桥接模式
网络·智能路由器·桥接模式
被摘下的星星4 小时前
计算机网络的定义和组成
网络·计算机网络