• 请不要在回答技术问题时复制粘贴 AI 生成的内容
SupperMary
V2EX  ›  程序员

如何用 winsock 向一个广播地址发送一个 ssdp 消息,并接收回应消息。

  •  
  •   SupperMary · Sep 15, 2018 via Android · 3273 views
    This topic created in 2808 days ago, the information mentioned may be changed or developed.

    google 和 stackflow 都找过了,所以来 v2 问一下。

    大概是这样 向 239.255.255.250:1900 发送一个消息,文档说是用 udp,我把消息用 sendto()发出去了,如何监听响应消息? 大佬就不要嘲笑我了,请指教一下。

    其实我就是想尝试一下这个小米台灯的局域网控制

    https://www.yeelight.com/zh_CN/developer

    Supplement 1  ·  Dec 18, 2018

    不太确定之前为什么获取不到响应,今天这样做可以获取到响应了

    #define _WINSOCK_DEPRECATED_NO_WARNINGS
    
    #include <stdio.h>
    #include <winsock2.h>
    
    #pragma comment(lib, "ws2_32.lib") 
    
    int main(int argc, char* argv[])
    {
    	WORD socketVersion = MAKEWORD(2, 2);
    	WSADATA wsaData;
    	if (WSAStartup(socketVersion, &wsaData) != 0)
    	{
    		return 0;
    	}
    	SOCKET sclient = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    
    	sockaddr_in sin;
    	sin.sin_family = AF_INET;
    	sin.sin_port = htons(1982);
    	sin.sin_addr.S_un.S_addr = inet_addr("239.255.255.250");
    	int len = sizeof(sin);
    
    	const char * sendData = "M-SEARCH * HTTP/1.1\r\nHOST: 239.255.255.250:1982\r\nMAN: \"ssdp:discover\"\r\nST: wifi_bulb";
    	sendto(sclient, sendData, strlen(sendData), 0, (sockaddr *)&sin, len);
    
    	char recvData[1024];
    	int ret = recvfrom(sclient, recvData, 1024, 0, (sockaddr *)&sin, &len);
    	if (ret > 0)
    	{
    		recvData[ret] = 0x00;
    		printf(recvData);
    	}
    
    	closesocket(sclient);
    	WSACleanup();
    	return 0;
    }
    

    11 replies    2018-10-01 11:31:39 +08:00
    InternetExplorer
        1
    InternetExplorer  
       Sep 15, 2018
    先监听,再发送。udp 是没有连接的,对方想发给你自然会发给你,前提是你要做好了接收的准备。
    tianzry
        2
    tianzry  
       Sep 15, 2018 via Android
    😎笑
    ysc3839
        3
    ysc3839  
       Sep 15, 2018 via Android
    WinSock 大部分是兼容 BSD Socket 的,所以你要做的是搜索 BSD Socket 相关的代码。
    succlz123
        4
    succlz123  
       Sep 15, 2018   ❤️ 1
    一个线程发,一个线程收,端口用系统分配的,这个 ip 是 UPnP 的多播地址,不是广播。
    jimzhong
        5
    jimzhong  
       Sep 15, 2018
    可以先发后收,操作系统会 queue 未被用户态收取的 UDP 包。不过你这个地址比较独特,可能需要 setsockopt().
    SupperMary
        6
    SupperMary  
    OP
       Sep 16, 2018 via Android
    @tianzry 😯
    SupperMary
        7
    SupperMary  
    OP
       Sep 16, 2018 via Android
    @jimzhong 尝试过了,收不到响应的消息~
    SupperMary
        8
    SupperMary  
    OP
       Sep 16, 2018 via Android
    SupperMary
        9
    SupperMary  
    OP
       Sep 16, 2018 via Android
    @ysc3839 好的,我去看看
    SupperMary
        10
    SupperMary  
    OP
       Sep 16, 2018 via Android
    @InternetExplorer 好的,我去试一下
    SupperMary
        11
    SupperMary  
    OP
       Oct 1, 2018
    试一下上传图片
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2854 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 39ms · UTC 09:20 · PVG 17:20 · LAX 02:20 · JFK 05:20
    ♥ Do have faith in what you're doing.