C++中实现UDP通信需使用套接字API,首先创建套接字,客户端发送数据到服务器并可接收响应,服务器绑定端口监听并回复客户端,核心函数为sendto和recvfrom,需注意跨平台兼容性及资源释放。

在C++中实现UDP通信主要依赖操作系统提供的套接字(Socket)API。UDP是一种无连接的传输协议,适合对实时性要求高、能容忍少量数据丢失的场景,比如音视频传输或游戏通信。下面介绍如何在Linux和Windows平台下使用C++实现基本的UDP通信。
创建UDP客户端
UDP客户端的主要任务是向指定的服务器发送数据,并可选择接收响应。
步骤说明:
初始化套接字设置服务器地址信息发送数据到服务器可选:接收服务器返回的数据关闭套接字
示例代码(跨平台兼容,以Linux为主,Windows需初始化WSA):
立即学习“C++免费学习笔记(深入)”;
#include #include #ifdef _WIN32 #include #pragma comment(lib, "ws2_32.lib")#else #include #include #include #include #endifint main() {
ifdef _WIN32
WSADATA wsa;WSAStartup(MAKEWORD(2,2), &wsa);
endif
int sock = socket(AF_INET, SOCK_DGRAM, 0);if (sock == -1) {std::cerr << "Socket creation failedn";return -1;}
struct sockaddr_in serverAddr;std::memset(&serverAddr, 0, sizeof(serverAddr));serverAddr.sin_family = AF_INET;serverAddr.sin_port = htons(8888);serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); // 目标IP
const char msg = "Hello UDP Server";sendto(sock, msg, strlen(msg), 0,(struct sockaddr)&serverAddr, sizeof(serverAddr));
// 接收回传消息char buffer[1024];socklen_t len = sizeof(serverAddr);int n = recvfrom(sock, buffer, sizeof(buffer)-1, 0,(struct sockaddr*)&serverAddr, &len);if (n > 0) {buffer[n] = ' ';std::cout << "Received: " << buffer << std::endl;}
ifdef _WIN32
closesocket(sock);WSACleanup();
else
close(sock);
endif
return 0;}
创建UDP服务器
UDP服务器监听指定端口,接收来自客户端的数据并可回传响应。
关键点:
绑定本地IP和端口持续监听接收数据可获取客户端地址用于回复
示例代码:
#include #include #ifdef _WIN32 #include #pragma comment(lib, "ws2_32.lib")#else #include #include #include #include #endifint main() {
ifdef _WIN32
WSADATA wsa;WSAStartup(MAKEWORD(2,2), &wsa);
endif
int sock = socket(AF_INET, SOCK_DGRAM, 0);if (sock == -1) {std::cerr << "Socket creation failedn";return -1;}
struct sockaddr_in serverAddr;std::memset(&serverAddr, 0, sizeof(serverAddr));serverAddr.sin_family = AF_INET;serverAddr.sin_addr.s_addr = INADDR_ANY; // 监听所有网卡serverAddr.sin_port = htons(8888);
if (bind(sock, (struct sockaddr*)&serverAddr, sizeof(serverAddr)) == -1) {std::cerr << "Bind failedn";
ifdef _WIN32
closesocket(sock);
else
close(sock);
endif
return -1;
}
std::cout
char buffer[1024];struct sockaddr_in clientAddr;socklen_t clientLen = sizeof(clientAddr);
while (true) {int n = recvfrom(sock, buffer, sizeof(buffer)-1, 0,(struct sockaddr*)&clientAddr, &clientLen);if (n > 0) {buffer[n] = ' ';std::cout
// 回复客户端 const char* reply = "ACK"; sendto(sock, reply, strlen(reply), 0, (struct sockaddr*)&clientAddr, clientLen);}
}
ifdef _WIN32
closesocket(sock);WSACleanup();
else
close(sock);
endif
return 0;}
编译与运行说明
Linux:
保存为 .cpp 文件,使用 g++ 编译命令:g++ udp_server.cpp -o server && ./server
Windows:
使用 Visual Studio 或 MinGW 编译确保链接 ws2_32.lib(Visual Studio 会自动处理#pragma)
注意事项
UDP不保证数据到达,也不保证顺序,应用层需自行处理每次 recvfrom 可能收到一个完整的报文(UDP是面向报文的)sendto 和 recvfrom 是UDP通信的核心函数跨平台时注意头文件和关闭套接字的差异
基本上就这些。只要理解了套接字的基本流程,UDP通信实现起来并不复杂,但要注意错误处理和资源释放。
以上就是c++++怎么实现UDP通信_c++ UDP通信实现方法的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1478600.html
微信扫一扫
支付宝扫一扫