我正在openWRT linux环境中工作,并尝试在我的LAN网络上启用UPnP,同时在任何给定点监视连接的设备。

为此,我在系统中启用了miniupnpd以及minissdpd。

我编写了以下函数,用于调查minissdpd,以试图了解当前连接了哪些设备(基于minissdpd代码所有者示例):

static int query_connectedDevices(void)
{
    struct sockaddr_un addr;
    int s, nRet = 0;
    const char * minissdpdsocketpath = "/var/run/minissdpd.sock";
    unsigned char buffer[2048];
    unsigned char * p;
    const char * device = "urn:schemas-upnp-org:device:InternetGatewayDevice:1";
    int device_len = (int)strlen(device);

    /*Open communication socket with minissdpd process*/
    s = socket(AF_UNIX, SOCK_STREAM, 0);
    if(s < 0) {
        return -1;
    }
    addr.sun_family = AF_UNIX;
    strncpy(addr.sun_path, minissdpdsocketpath, sizeof(addr.sun_path));
    if(connect(s, (struct sockaddr *)&addr, sizeof(struct sockaddr_un)) < 0) {
        return -1;
    }

    buffer[0] = 1; /* request type 1 : request devices/services by type */
    p = buffer + 1;
    CODELENGTH(device_len, p);
    memcpy(p, device, device_len);
    p += device_len;
    nRet = write(s, buffer, p - buffer);
    if (nRet < 0) {
        goto query_exit;
    }
    memset(buffer, 0x0, sizeof(buffer));
    nRet = read(s, buffer, sizeof(buffer));
    if (nRet < 0) {
        goto query_exit;
    }

    nRet = 0;

query_exit:
    close (s);
    return nRet;


}

我的问题是,无论实际上有多少设备连接到UPnP网络,我总是从minissdpd取回值“1”。

取自minissdpd页面-



**编辑-

我尝试触发所有3种受支持的请求类型,这些都是响应,请注意,空回读=“”表示未回读任何数据:
Buffer value = 3urn:schemas-upnp-org:device:InternetGatewayDevice:1
Buffer value read back =  return value = 1
Buffer value = 3urn:schemas-upnp-org:device:InternetGatewayDevice:1
Buffer value read back =  return value = 1
Buffer value = 3urn:schemas-upnp-org:device:InternetGatewayDevice:1
Buffer value read back = $http://192.168.1.1:5000/rootDesc.xml/urn:schemas-   upnp-org:service:Layer3Forwarding:1Zuuid:27f10a12-a448-434f-9b33-    966bcf662cc3::urn:schemas-upnp-    org:service:Layer3Forwarding:1$http://192.168.1.1:5000/rootDesc.xml.urn:schemas-    upnp-org:service:WANIPConnection:1Yuuid:27f10a12-a448-434f-9b33-    966bcf662cc3::urn:schemas-upnp-    org:service:WANIPConnection:1$http://192.168.1.1:5000/rootDesc.xmlupnp:rootdevic    e:uuid:27f10a12-a448-434f-9b33-966bcf662cc3::upnp:rootdevice return value =    463

难道我做错了什么?

谢谢!

最佳答案

“在我的局域网上启用UPnP”是什么意思?

miniupnpd是一个IGD实现,例如,它与UPnP AV没有关系。

要发现局域网中存在的所有UPnP设备,可以使用miniupnpc随附的listdevice工具。

minissdpd监视网络上可用的UPnP设备。如果可用于获取设备列表,libminiupnpc将使用它。

可以确定,当请求的设备类型为urn:schemas-upnp-org:device:InternetGatewayDevice:1(IGD)时,它仅返回1个设备。

我想您的局域网上只有一个UPnP IGD:路由器。

您的意思是“无论实际上有多少客户端连接到UPnP网络”。 UPnP官方术语中没有“客户端”之类的东西。网络上有UPnP设备和控制点

关于c - miniupnpssdpd查询连接的设备数失败,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38245656/

10-12 05:32