asio 组播ssdp
注意:低版本的asio lib必须要加入预定义 ASIO_STANDALONE
上次写了一个boost加入组播的代码,这次我们不在使用boost,直接使用asio
1、加入组播是基础, 2、然后再搜索ssdp信息, 3、然后再回单播信息。
以上就是流程,不要小看这几句话,按照这个流程走,ssdp信息才可以搜索并正确回复。
搜索信息// 以下是搜索信息,只要搜索到我们定义的,我们就可以回复信息,否则不予理睬
static const char *g_Searchssdp = "M-SEARCH * HTTP/1.1\r\nHOST:239.255.255.250:1900\r\nMAN:\"ssdp:discover\"\r\nST:urn:schemas-upnp-org:device:MediaRenderer:1\r\nMX:3\r\n\r\n";
以下函数为比较,虽然粗糙,实际上是原理
void handle_receive(char *data,size_t length)
{
string d(data,length);
if(d.compare(g_Searchssdp)==0)
{
// do what you want!
}
// fix me
}
show me the code
#include
#include
#include
//#include "boost/bind.hpp"
//ssdp 协议
const short multicast_port = 1900;
using namespace std;
using namespace asio;
using namespace asio::ip;
class receiver
{
public:
receiver(asio::io_context& io_service,
const asio::ip::address& listen_address,
const asio::ip::address& multicast_address)
: socket_(io_service)
{
// Create the socket so that multiple may be bound to the same address.
asio::ip::udp::endpoint listen_endpoint(
listen_address, multicast_port);
socket_.open(listen_endpoint.protocol());
socket_.set_option(asio::ip::udp::socket::reuse_address(true));
socket_.bind(listen_endpoint);
// Join the multicast group.
socket_.set_option(
asio::ip::multicast::join_group(multicast_address));
}
void handle_receive(char *data,size_t length)
{
string d(data,length);
if(d.compare(g_Searchssdp)==0)
{
// do what you want!
}
// fix me
}
void start_receive()
{
socket_.async_receive_from(
asio::buffer(data_, max_length), sender_endpoint_,
[this](std::error_code &ec, std::size_t bytes_recvd)
{
if (!ec)
{
std::cout.write(data_, bytes_recvd);
std::cout
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?