本文主要是介绍C++使用Poco库指定网卡去接收组播数据,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
-
0x00
1、以下代码封装了一个UDP接收组播数据的类,第一个构造函数 Poco::Net::DatagramSocket 类可以实现UDP单播数据的接收、发送以及往组播发送数据,第二个构造函数使用Poco::Net::MulticastSocket类去接收组播数据,UdpUnit类中成员函数Recv仅仅实现了组播数据的接收,可以改成使用 Poco::Net::DatagramSocket 去接收单播数据。
-
0x01
2、Poco::Net::MulticastSocket在使用 joinGroup 函数加入组播时,可以只填写第一个参数"组播地址",Poco中Net库可以为你选择默认网卡加入组播,如果需要指定网卡加入组播时则使用 Poco::Net::NetworkInterface 类去选择需要的网卡。
-
0x02
#ifndef UDP_UNIT_H
#define UDP_UNIT_H#include <string>
#include <Poco/Net/Socket.h>
#include <Poco/Net/SocketAddress.h>
#include <Poco/Net/DatagramSocket.h>
#include <Poco/Net/MulticastSocket.h>
#include <Poco/Net/NetException.h>
#include <Poco/Net/NetworkInterface.h>#define RECV_BUFFER_SIZE 1024 * 1024 * 1class UdpUnit
{
public:UdpUnit(std::string const local_addr, int const local_port);UdpUnit(std::string const local_addr, std::string const multicast_addr, int const multicast_port);int Recv(std::string &recvMsg);int Recv(char *buffer, int bufferSize);int Send(const char *buffer, int bufferSize, const std::string remote_addr, const int remote_port);private:Poco::Net::SocketAddress m_localAddress;Poco::Net::DatagramSocket m_datagramSocket;Poco::Net::MulticastSocket m_multicastSocket;
};#endif
#include "udpUnit.h"UdpUnit::UdpUnit(std::string const local_addr, int const local_port) : m_localAddress(local_addr, local_port)
{// 单播数据try{m_datagramSocket.bind(m_localAddress, true);}catch (const Poco::Exception &ex){printf("Error: %s\n", ex.displayText().c_str());}
}UdpUnit::UdpUnit(std::string const local_addr, std::string const multicast_addr, int const multicast_port)
{// 组播数据try{m_multicastSocket.bind(Poco::Net::SocketAddress(multicast_port), true);// 指定网卡加入组播Poco::Net::IPAddress localAddr(local_addr);Poco::Net::NetworkInterface iInterface;iInterface.addAddress(localAddr);Poco::Net::IPAddress multicastAddr(multicast_addr);m_multicastSocket.joinGroup(multicastAddr, iInterface);}catch (const Poco::Exception &ex){printf("Error: %s\n", ex.displayText().c_str());}
}int UdpUnit::Recv(std::string &recvMsg)
{int bytesReceived = -1;try{char recvBuffer[RECV_BUFFER_SIZE];Poco::Net::SocketAddress otherAddr;bytesReceived = m_multicastSocket.receiveFrom(recvBuffer, RECV_BUFFER_SIZE, otherAddr);printf("Received from <%s:%d>\n", otherAddr.host().toString().c_str(), otherAddr.port());recvMsg.assign(recvBuffer, bytesReceived);}catch (const Poco::Exception &ex){printf("Exception: %s\n", ex.displayText().c_str());}return bytesReceived;
}int UdpUnit::Recv(char *buffer, int bufferSize)
{int bytesReceived = -1;try{Poco::Net::SocketAddress otherAddr;bytesReceived = m_multicastSocket.receiveFrom(buffer, bufferSize, otherAddr);printf("Received from <%s:%d>\n", otherAddr.host().toString().c_str(), otherAddr.port());}catch (const Poco::Exception &ex){printf("Exception: %s\n", ex.displayText().c_str());}return bytesReceived;
}int UdpUnit::Send(const char *buffer, int bufferSize, const std::string remote_addr, const int remote_port)
{Poco::Net::SocketAddress m_remoteAddress(remote_addr, remote_port);int bytesSend = m_datagramSocket.sendTo(buffer, bufferSize, m_remoteAddress);return bytesSend;
}
这篇关于C++使用Poco库指定网卡去接收组播数据的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!