UPnP(Universal Plug and Play,通用即插即用)是一种网络协议,允许设备在局域网内自动发现和通信。它主要用于简化设备的网络配置过程,使得设备能够自动获取IP地址、与其他设备通信等。
问题描述:无法显示本地网络内的所有UPnP设备。
可能原因:
确保防火墙和安全软件允许UPnP通信。通常需要开放以下端口:
239.255.255.250
1900
检查网络中的设备是否启用了UPnP功能。可以通过设备的设置菜单进行确认。
确保路由器或其他网络设备支持并启用了UPnP功能。
以下是一个简单的C++示例代码,用于发现本地网络内的UPnP设备:
#include <iostream>
#include <string>
#include <vector>
#include <boost/asio.hpp>
#include <boost/bind.hpp>
using boost::asio::ip::udp;
void handle_receive(const boost::system::error_code& error, std::size_t bytes_transferred, udp::socket& socket, std::vector<char>& buffer) {
if (!error) {
std::string response(buffer.data(), bytes_transferred);
std::cout << "Received UPnP response:\n" << response << std::endl;
// 解析响应并提取设备信息
}
}
void discover_upnp_devices() {
boost::asio::io_context io_context;
udp::socket socket(io_context, udp::endpoint(udp::v4(), 0));
socket.set_option(boost::asio::ip::multicast::join_group(boost::asio::ip::make_address("239.255.255.250", boost::asio::error::get_default_error_condition(0).default_error_condition().value())));
std::vector<char> buffer(65536);
udp::endpoint sender_endpoint;
// 发送M-SEARCH请求
std::string request = "M-SEARCH * HTTP/1.1\r\nHOST: 239.255.255.250:1900\r\nMAN: \"ssdp:discover\"\r\nMX: 3\r\nST: ssdp:all\r\n\r\n";
socket.send_to(boost::asio::buffer(request), udp::endpoint(boost::asio::ip::make_address("239.255.255.250", boost::asio::error::get_default_error_condition(0).default_error_condition().value()), 1900));
// 接收响应
socket.async_receive_from(boost::asio::buffer(buffer), sender_endpoint, boost::bind(handle_receive, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred, boost::ref(socket), boost::ref(buffer)));
io_context.run();
}
int main() {
discover_upnp_devices();
return 0;
}
通过以上步骤和代码示例,应该能够解决无法显示本地网络内所有UPnP设备的问题。
领取专属 10元无门槛券
手把手带您无忧上云