首页 > 后端开发 > C++ > 正文

c++怎么实现UDP通信_c++ UDP通信实现方法

尼克
发布: 2025-10-12 08:29:01
原创
749人浏览过
C++中实现UDP通信需使用套接字API,首先创建套接字,客户端发送数据到服务器并可接收响应,服务器绑定端口监听并回复客户端,核心函数为sendto和recvfrom,需注意跨平台兼容性及资源释放。

c++怎么实现udp通信_c++ udp通信实现方法

在C++中实现UDP通信主要依赖操作系统提供的套接字(Socket)API。UDP是一种无连接的传输协议,适合对实时性要求高、能容忍少量数据丢失的场景,比如音视频传输或游戏通信。下面介绍如何在Linux和Windows平台下使用C++实现基本的UDP通信。

创建UDP客户端

UDP客户端的主要任务是向指定的服务器发送数据,并可选择接收响应。

步骤说明:

  • 初始化套接字
  • 设置服务器地址信息
  • 发送数据到服务器
  • 可选:接收服务器返回的数据
  • 关闭套接字

示例代码(跨平台兼容,以Linux为主,Windows需初始化WSA):

立即学习C++免费学习笔记(深入)”;

#include <iostream>
#include <cstring>
#ifdef _WIN32
  #include <winsock2.h>
  #pragma comment(lib, "ws2_32.lib")
#else
  #include <sys/socket.h>
  #include <netinet/in.h>
  #include <arpa/inet.h>
  #include <unistd.h>
#endif
<p>int main() {</p><h1>ifdef _WIN32</h1><p>WSADATA wsa;
WSAStartup(MAKEWORD(2,2), &wsa);</p><h1>endif</h1><p>int sock = socket(AF_INET, SOCK_DGRAM, 0);
if (sock == -1) {
std::cerr << "Socket creation failed\n";
return -1;
}</p><p>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</p><p>const char<em> msg = "Hello UDP Server";
sendto(sock, msg, strlen(msg), 0,
(struct sockaddr</em>)&serverAddr, sizeof(serverAddr));</p><p>// 接收回传消息
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] = '\0';
std::cout << "Received: " << buffer << std::endl;
}</p><h1>ifdef _WIN32</h1><p>closesocket(sock);
WSACleanup();</p><h1>else</h1><p>close(sock);</p><h1>endif</h1><p>return 0;
}</p>
登录后复制

创建UDP服务器

UDP服务器监听指定端口,接收来自客户端的数据并可回传响应。

关键点:

  • 绑定本地IP和端口
  • 持续监听接收数据
  • 可获取客户端地址用于回复

示例代码:

微信 WeLM
微信 WeLM

WeLM不是一个直接的对话机器人,而是一个补全用户输入信息的生成模型。

微信 WeLM 33
查看详情 微信 WeLM
#include <iostream>
#include <cstring>
#ifdef _WIN32
  #include <winsock2.h>
  #pragma comment(lib, "ws2_32.lib")
#else
  #include <sys/socket.h>
  #include <netinet/in.h>
  #include <arpa/inet.h>
  #include <unistd.h>
#endif
<p>int main() {</p><h1>ifdef _WIN32</h1><p>WSADATA wsa;
WSAStartup(MAKEWORD(2,2), &wsa);</p><h1>endif</h1><p>int sock = socket(AF_INET, SOCK_DGRAM, 0);
if (sock == -1) {
std::cerr << "Socket creation failed\n";
return -1;
}</p><p>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);</p><p>if (bind(sock, (struct sockaddr*)&serverAddr, sizeof(serverAddr)) == -1) {
std::cerr << "Bind failed\n";</p><h1>ifdef _WIN32</h1><pre class='brush:php;toolbar:false;'>closesocket(sock);
登录后复制

else

close(sock);
登录后复制

endif

return -1;
登录后复制

}

std::cout << "UDP Server running on port 8888...\n";

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] = '\0'; std::cout << "Client says: " << buffer << std::endl;

  // 回复客户端
  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通信实现方法的详细内容,更多请关注php中文网其它相关文章!

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号