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

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

  •  
  •   SupperMary · 155 天前用 Android 发布 · 947 次点击
    这是一个创建于 155 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

    第 1 条附言  ·  62 天前

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

    #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
        1
    InternetExplorer   155 天前
    先监听,再发送。udp 是没有连接的,对方想发给你自然会发给你,前提是你要做好了接收的准备。
        2
    tianzry   155 天前 via Android
    😎笑
        3
    ysc3839   155 天前 via Android
    WinSock 大部分是兼容 BSD Socket 的,所以你要做的是搜索 BSD Socket 相关的代码。
        4
    succlz123   155 天前   ♥ 1
    一个线程发,一个线程收,端口用系统分配的,这个 ip 是 UPnP 的多播地址,不是广播。
        5
    jimzhong   155 天前
    可以先发后收,操作系统会 queue 未被用户态收取的 UDP 包。不过你这个地址比较独特,可能需要 setsockopt().
        6
    SupperMary   154 天前 via Android
    @tianzry 😯
        7
    SupperMary   154 天前 via Android
    @jimzhong 尝试过了,收不到响应的消息~
        8
    SupperMary   154 天前 via Android
        9
    SupperMary   154 天前 via Android
    @ysc3839 好的,我去看看
        10
    SupperMary   154 天前 via Android
    @InternetExplorer 好的,我去试一下
        11
    SupperMary   139 天前
    试一下上传图片
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   3985 人在线   最高记录 4346   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 16ms · UTC 02:16 · PVG 10:16 · LAX 18:16 · JFK 21:16
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1