V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
SupperMary
V2EX  ›  程序员

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

  •  
  •   SupperMary · 2018-09-15 17:00:01 +08:00 via Android · 2700 次点击
    这是一个创建于 2262 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

    第 1 条附言  ·  2018-12-18 09:36:12 +08:00

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

    #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 条回复    2018-10-01 11:31:39 +08:00
    InternetExplorer
        1
    InternetExplorer  
       2018-09-15 17:55:06 +08:00
    先监听,再发送。udp 是没有连接的,对方想发给你自然会发给你,前提是你要做好了接收的准备。
    tianzry
        2
    tianzry  
       2018-09-15 18:38:36 +08:00 via Android
    😎笑
    ysc3839
        3
    ysc3839  
       2018-09-15 18:50:30 +08:00 via Android
    WinSock 大部分是兼容 BSD Socket 的,所以你要做的是搜索 BSD Socket 相关的代码。
    succlz123
        4
    succlz123  
       2018-09-15 19:08:19 +08:00   ❤️ 1
    一个线程发,一个线程收,端口用系统分配的,这个 ip 是 UPnP 的多播地址,不是广播。
    jimzhong
        5
    jimzhong  
       2018-09-15 21:23:16 +08:00
    可以先发后收,操作系统会 queue 未被用户态收取的 UDP 包。不过你这个地址比较独特,可能需要 setsockopt().
    SupperMary
        6
    SupperMary  
    OP
       2018-09-16 12:12:15 +08:00 via Android
    @tianzry 😯
    SupperMary
        7
    SupperMary  
    OP
       2018-09-16 12:12:50 +08:00 via Android
    @jimzhong 尝试过了,收不到响应的消息~
    SupperMary
        8
    SupperMary  
    OP
       2018-09-16 12:13:04 +08:00 via Android
    SupperMary
        9
    SupperMary  
    OP
       2018-09-16 12:13:18 +08:00 via Android
    @ysc3839 好的,我去看看
    SupperMary
        10
    SupperMary  
    OP
       2018-09-16 12:13:34 +08:00 via Android
    @InternetExplorer 好的,我去试一下
    SupperMary
        11
    SupperMary  
    OP
       2018-10-01 11:31:39 +08:00
    试一下上传图片
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2744 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 10:10 · PVG 18:10 · LAX 02:10 · JFK 05:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.