活动介绍
file-type

Linux下C/C++ UDP通信全解:单播组播与网卡指定

ZIP文件

下载需积分: 2 | 4KB | 更新于2025-01-18 | 43 浏览量 | 30 下载量 举报 6 收藏
download 立即下载
代码特别支持了指定网卡进行数据传输,同时涵盖了UDP单播和组播的实现。开发者可以根据需要将发送和接收功能分别封装在两个独立的类中,这些类可以直接导入其他项目中使用,简化了网络编程的工作量。 详细知识点如下: 1. Linux网络编程基础:Linux下的C/C++网络编程通常涉及到套接字(Socket)的创建和使用,UDP协议是无连接的网络协议,适用于不需要建立连接即可发送接收数据的场景。本资源中的代码基于Linux下的socket编程接口。 2. UDP单播与组播通信:UDP单播指的是在一对主机之间进行的数据传输,每条消息只传递给特定的一个接收者。而UDP组播则允许多个接收者加入一个组播组,发送者只需发送一次消息,所有组播组成员都能收到。在本资源中,代码实现了UDP单播和组播的发送和接收功能。 3. 指定网卡的数据传输:在多网卡的Linux系统中,有时候需要指定特定的网卡进行数据的发送和接收。这种情况下,需要配置socket选项,设置源IP地址或接口索引,确保数据流通过指定的网卡。本资源中的代码提供了设置和使用指定网卡进行通信的实现方式。 4. 类的设计与封装:为了代码的重用性和模块化,发送和接收功能被封装在了两个独立的类中。发送类(UDPOperationSend)和接收类(UDPOperationRecv)分别负责各自的职责,使得代码结构清晰,便于维护和扩展。 5. 文件列表解析: - UDPOperationRecv.cpp:包含了实现UDP数据接收功能的源代码。 - UDPOperationSend.cpp:包含了实现UDP数据发送功能的源代码。 - UDPOperationSend.h:是发送类的头文件,定义了发送类的接口。 - UDPOperationRecv.h:是接收类的头文件,定义了接收类的接口。 这些类中包含了必要的函数,如初始化、绑定地址、数据发送接收、清理资源等。通过这些类的封装,用户无需深入了解网络编程的复杂细节,便可以方便地实现网络数据传输的功能。 6. 网络编程的最佳实践:本资源中的代码遵循了网络编程的许多最佳实践,例如错误处理、资源管理(如使用智能指针或RAII管理socket资源)等,保障了代码的健壮性和可靠性。 总结而言,本资源为需要在Linux环境下进行UDP通信的C/C++开发者提供了一套完善且易于集成的解决方案,涉及的知识点涵盖了Linux网络编程、UDP协议、多网卡通信和面向对象的代码封装。"

相关推荐

filetype

#include "UdpReceive.h" UdpReceive::UdpReceive(QObject* parent) : QObject(parent) { platformUdpSocket = new QUdpSocket(this); connect(platformUdpSocket, &QUdpSocket::readyRead, this, &UdpReceive::receiveData); targetIP = QHostAddress(getLocalIP()); } UdpReceive::~UdpReceive() { } void UdpReceive::zeroReceiveSize() { receiveSize = 0; emit sendReceiveSize(receiveSize); } //槽函数--UDP数据接收 void UdpReceive::receiveData() { QByteArray info; static QByteArray data; int len; if (platformUdpSocket->pendingDatagramSize() >= 1) //hasPendingDatagrams是否有待读取的缓冲数据报 { info.resize(platformUdpSocket->pendingDatagramSize()); //pendingDatagramSize返回待读取数据报的字节数 platformUdpSocket->readDatagram(info.data(), info.size()); //读取数据报的内容 读取size个数据到data中 data += info; len = data.length(); QVector<float> temp; // 数据包存储缓存 float buf; // 数据存储缓存 QString str = QString::fromStdString(data.toStdString());// 接收到的数据转成QString QStringList list = str.split(" "); // 按空格分隔数据包 QListIterator<QString> li(list); while (li.hasNext()) { buf = li.next().toFloat(); //转换成float类型存储 temp.append(buf); } receiveSize++; //发送数据 emit sendReceiveData(temp); emit sendReceiveSize(receiveSize); temp.clear(); data.clear(); } } void UdpReceive::connectUdp() { if (platformUdpSocket->bind(QHostAddress::AnyIPv4, 9876)) { connectFlag = true; qDebug() << "提示:上下位机UDP端口已连接!" << endl; QString msg = "500"; //下位机已连接指令 //sendMsg2TargetIP(msg); } else { qDebug() << "提示:无法打开端口!" << endl;; } } //发送数据到指定IP,port void UdpReceive::sendMsg2TargetIP(QString msg) { QByteArray str = msg.toUtf8(); platformUdpSocket->writeDatagram(str, targetIP, 9876); } //发送数据到指定IP,port void UdpReceive::sendMsg2unityIP(QString msg) { QByteArray str = msg.toUtf8().toHex(); platformUdpSocket->writeDatagram(str, QHostAddress("192.168.3.102"), 8888); qDebug() << "发送下位机静止指令:" << msg; } void UdpReceive::abortUdp() { connectFlag = false; platformUdpSocket->abort(); } //获取本机IP QString UdpReceive::getLocalIP() { QString hostName = QHostInfo::localHostName(); //本地主机名 QHostInfo hostInfo = QHostInfo::fromName(hostName); //根据主机名获取主机信息 QString localIP = ""; QList<QHostAddress> addList = hostInfo.addresses(); //获取主机地址列表 if (!addList.isEmpty()) { for (int i = 0; i < addList.count(); i++) { QHostAddress aHost = addList[i]; if (QAbstractSocket::IPv4Protocol == aHost.protocol()) { localIP = aHost.toString(); break; } } } return localIP; } 这个是程序里UDP的代码