google 和 stackflow 都找过了,所以来 v2 问一下。
大概是这样 向 239.255.255.250:1900 发送一个消息,文档说是用 udp,我把消息用 sendto()发出去了,如何监听响应消息? 大佬就不要嘲笑我了,请指教一下。
其实我就是想尝试一下这个小米台灯的局域网控制
不太确定之前为什么获取不到响应,今天这样做可以获取到响应了
#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;
}
1
InternetExplorer 2018-09-15 17:55:06 +08:00
先监听,再发送。udp 是没有连接的,对方想发给你自然会发给你,前提是你要做好了接收的准备。
|
2
tianzry 2018-09-15 18:38:36 +08:00 via Android
😎笑
|
3
ysc3839 2018-09-15 18:50:30 +08:00 via Android
WinSock 大部分是兼容 BSD Socket 的,所以你要做的是搜索 BSD Socket 相关的代码。
|
4
succlz123 2018-09-15 19:08:19 +08:00 1
一个线程发,一个线程收,端口用系统分配的,这个 ip 是 UPnP 的多播地址,不是广播。
|
5
jimzhong 2018-09-15 21:23:16 +08:00
可以先发后收,操作系统会 queue 未被用户态收取的 UDP 包。不过你这个地址比较独特,可能需要 setsockopt().
|
6
SupperMary OP @tianzry 😯
|
7
SupperMary OP @jimzhong 尝试过了,收不到响应的消息~
|
8
SupperMary OP @succlz123 ok
|
9
SupperMary OP @ysc3839 好的,我去看看
|
10
SupperMary OP @InternetExplorer 好的,我去试一下
|
11
SupperMary OP 试一下上传图片
|