Demo:UDP 报文回显
可构建、可运行、可验证,并与仓库 examples 目录中的源码保持一致。
1. 示例内容
完整源码中的关键调用均有中文注释,页面同时给出运行命令、验证方法和可调整参数。
2. 构建与运行
cmake --build build --target sttnet_udp_echo --parallel
./build/examples/sttnet_udp_echo3. 运行结果
printf "hello" | nc -u -w1 127.0.0.1 9003预期:返回 hello。
4. 完整源码
#include <sttnet.h>
#include <atomic>
#include <iostream>
#include <thread>
int main()
{
using namespace stt::network;
using stt::system::ServerSetting;
if(!ServerSetting::blockTerminationSignals())
return 1;
// UDP socket 使用一秒接收超时,便于循环
// 在不使用危险异步 handler 的情况下检查退出标志。
UdpServer server(7070, false, 1, true);
if(server.getFD() < 0)
{
std::cerr << "failed to bind UDP port 7070\n";
return 2;
}
std::atomic<bool> running{true};
std::thread signalThread([&running] {
ServerSetting::waitForTerminationSignal();
running.store(false, std::memory_order_release);
});
std::cout << "UDP echo listening on 127.0.0.1:7070\n";
while(running.load(std::memory_order_acquire))
{
std::string data;
std::string peerIP;
int peerPort = 0;
const int received = server.recvData(data, 64 * 1024, peerIP, peerPort);
if(received == -100)
continue; // 接收超时:重新检查退出标志。
if(received <= 0)
continue;
// UDP 保留报文边界;把当前报文回发给发送端。
const int sent = server.sendData(data, peerIP, peerPort);
if(sent <= 0)
std::cerr << "failed to reply to " << peerIP << ':' << peerPort << '\n';
}
server.close();
signalThread.join();
return 0;
}