0

我正在尝试使用 UPnP 访问 WeMo 电灯开关。在谷歌搜索了许多开源 c++ 库之后,我终于找到了一个用于基本发现 UPnP 设备的示例代码http://www.rohitab.com/discuss/topic/41267-ssdpupnp-protocol-example/#

我使用的是 Windows 10,我的笔记本电脑 WiFi 和 WeMo 交换机都在同一个 WiFi 网络中,禁用了防火墙。但我没有收到任何消息。我什至尝试将“搜索目标”ST选项更改为ssdp:all. 另一个示例代码https://objectpartners.com/2014/03/25/a-groovy-time-with-upnp-and-wemo/建议使用STas urn:Belkin:device:controllee:1,但任何设备都没有响应。

我的代码:

#include <stdio.h>
#include <string>
#include <winsock2.h>
#include <ws2tcpip.h>
#pragma comment(lib, "Ws2_32.lib")
#include <windows.h>
#include <stdio.h>
#include <conio.h>

#define SERVERPORT 1900
char buff[] = "M-SEARCH * HTTP/1.1\r\nHOST: 239.255.255.250:1900\r\nMAN: \"ssdp:discover\"\r\nMX: 3\r\nST: upnp:rootdevice\r\n";

int main()
{
    char rcvdbuff[1000];
    int len, Ret = 2;

    WSADATA wsaData;
    struct sockaddr_in their_addr;
    SOCKET sock;
    WSAStartup(MAKEWORD(2, 2), &wsaData);

    sock = socket(AF_INET, SOCK_DGRAM, 0);

    their_addr.sin_family = AF_INET;

    their_addr.sin_addr.s_addr = inet_addr("239.255.255.250");
    their_addr.sin_port = htons(SERVERPORT);
    len = sizeof(struct sockaddr_in);

    while (1)
    {
        printf("buff:\n%s\n", buff);
        Ret = sendto(sock, buff, strlen(buff), 0, (struct sockaddr*)&their_addr, len);
        if (Ret < 0)
        {
            printf("error in SENDTO() function");
            closesocket(sock);
            return 0;
        }

        //Receiving Text from server
        printf("\n\nwaiting to recv:\n");
        memset(rcvdbuff, 0, sizeof(rcvdbuff));
        Ret = recvfrom(sock, rcvdbuff, sizeof(rcvdbuff), 0, (struct sockaddr *)&their_addr, &len);
        if (Ret < 0)
        {
            printf("Error in Receiving");
            return 0;
        }
        rcvdbuff[Ret - 1] = '\0';
        printf("RECEIVED MESSAGE FROM SERVER\t: %s\n", rcvdbuff);

        //Delay for testing purpose
        Sleep(3 * 1000);
    }
    closesocket(sock);
    WSACleanup();
}
4

0 回答 0