- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想搜索网络上的 Sat>IP 服务器。 Sat>IP 服务器向其他 Sat>IP 服务器和客户端通告其存在。我不能连续发送 M-SEARCH 消息,而是监听服务器 NOTIFY 消息。
初始化设备的网络设置后,如果已经有任何事件的 Sat>IP 服务器,我将发送 M-SEARCH 消息并获得响应。但是,如果我在发送 M-SEARCH 消息后打开 Sat>IP 服务器,我无法得到任何响应。
这是我的代码。
void SatIP::InitDiscoverThread()
{
if(INVALID_THREAD_CHK == DiscoverThreadChk)
{
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setstacksize(&attr, PTHREAD_STACK_SIZE);
printf("InitDiscoverThread pthread_create\n");
DiscoverThreadChk = PTH_RET_CHK(pthread_create(&DiscoverThreadID, &attr, DiscoverThreadFunc, this));
if(DiscoverThreadChk != 0)
{
ASSERT(0);
}
}
}
void SatIP::FinalizeDiscoverThread()
{
if(INVALID_THREAD_CHK != DiscoverThreadChk)
{
printf("FinalizeDiscoverThread pthread_cancel\n");
pthread_cancel(DiscoverThreadID);
DiscoverThreadChk = INVALID_THREAD_CHK;
close(discoverSocket);
}
}
void *SatIP::DiscoverThreadFunc(void* arg)
{
SatIP* satip = (SatIP *)arg;
satip->ListenSSDPResponse();
pthread_exit(NULL);
}
bool SatIP::SendMSearchMessage()
{
vSatIPServers.clear();
FinalizeDiscoverThread();
const char *searchSatIPDevice = "M-SEARCH * HTTP/1.1\r\n" \
"HOST: 239.255.255.250:1900\r\n" \
"MAN: \"ssdp:discover\"\r\n" \
"MX: 2\r\n" \
"ST: urn:ses-com:device:SatIPServer:1\r\n\r\n";
struct sockaddr_in upnpControl, broadcast_addr;
discoverSocket = socket(AF_INET, SOCK_DGRAM, 0);
if (discoverSocket == INVALID_SOCKET)
{
printf("socked failed INVALID_SOCKET\n");
return false;
}
struct timeval tv;
tv.tv_sec = 1;
tv.tv_usec = 0;
if(setsockopt(discoverSocket, SOL_SOCKET, SO_RCVTIMEO, (char*)&tv, sizeof(tv)) == SOCKET_ERROR)
{
printf("setsockopt timeout failed\n");
close(discoverSocket);
return false;
}
socklen_t ttl = 2;
if(setsockopt(discoverSocket, IPPROTO_IP, IP_MULTICAST_TTL, &ttl, sizeof(ttl)) == SOCKET_ERROR)
{
printf("setsockopt TTL failed\n");
close(discoverSocket);
return false;
}
if(setsockopt(discoverSocket, SOL_SOCKET, SO_BROADCAST, searchSatIPDevice, sizeof(searchSatIPDevice)) == SOCKET_ERROR)
{
printf("setsockopt broadcast failed\n");
close(discoverSocket);
return false;
}
upnpControl.sin_family = AF_INET;
upnpControl.sin_port = htons(0);
upnpControl.sin_addr.s_addr = INADDR_ANY;
if (bind(discoverSocket, (sockaddr*)&upnpControl, sizeof(upnpControl)) == SOCKET_ERROR)
{
printf("bind failed\n");
close(discoverSocket);
return false;
}
broadcast_addr.sin_family = AF_INET;
broadcast_addr.sin_port = htons(1900);
broadcast_addr.sin_addr.s_addr = inet_addr("239.255.255.250");
for(int i = 0; i < 3; i++)
{
if(sendto(discoverSocket, searchSatIPDevice, strlen(searchSatIPDevice), 0, (sockaddr *)&broadcast_addr, sizeof(broadcast_addr)) == SOCKET_ERROR)
{
//printf("sendto failed\n");
close(discoverSocket);
return false;
}
else
{
usleep(10*100);
}
}
InitDiscoverThread();
return true;
}
void SatIP::ListenSSDPResponse()
{
while(1)
{
char buf[512];
memset(buf, 0, 512);
struct sockaddr_in broadcast_addr;
broadcast_addr.sin_family = AF_INET;
broadcast_addr.sin_port = htons(1900);
broadcast_addr.sin_addr.s_addr = inet_addr("239.255.255.250");
int bcLen = sizeof(broadcast_addr);
//bool bRet = false;
while (recvfrom(discoverSocket, buf, 512, 0, (struct sockaddr*)&broadcast_addr, (socklen_t*)&bcLen) > 0)
{
printf("buf:%s\n",buf);
SATIP_SERVER_DESCRIPTION stServerDesc;
ostringstream ss;
if(strstr(buf, "device:SatIPServer"))
{
int i = 0;
char *deviceIp = strstr(buf, "LOCATION:") + 9; // get xml location including server description
while(deviceIp[i] == ' ') i++; // remove spaces from string
while(!isspace(deviceIp[i]))
{
ss << deviceIp[i];
++i;
}
stServerDesc.location = ss.str().c_str();
printf("location:%s\n",stServerDesc.location.c_str());
ss.str(""); // clear ss
i=0; // clear counter
deviceIp = strstr(buf, "http://") + 7; // get ip address
while(deviceIp[i] != ':')
{
ss << deviceIp[i];
++i;
}
stServerDesc.ipAddr = ss.str().c_str();
printf("ipAddr:%s\n", stServerDesc.ipAddr.c_str());
DownloadDeviceDescription(&stServerDesc);
stServerDesc.macAddr = GetMACAddressviaIP(stServerDesc.ipAddr);
printf("macAddr:%s\n", stServerDesc.macAddr.c_str());
if(IsServerProperToAdd(&stServerDesc))
vSatIPServers.push_back(stServerDesc);
printf("\n");
//bRet = true;
}
memset(buf, 0, 512);
}
}
}
如何解决这个问题?任何帮助将不胜感激。
最佳答案
监听SSDP通知消息与发送M-SEARCH消息无关。即使您不发送 M-SEARCH 消息,Sat>IP 等设备也会定期向 239.255.255.250 发送 NOTIFY 消息。因此,您应该加入一个多播组并从该组接收消息。
您可以使用以下链接中的监听程序,将HELLO_PORT更改为1900,将HELLO_GROUP更改为“239.255.255.250”。
http://ntrg.cs.tcd.ie/undergrad/4ba2/multicast/antony/example.html
/*
* listener.c -- joins a multicast group and echoes all data it receives from
* the group to its stdout...
*
* Antony Courtney, 25/11/94
* Modified by: Frédéric Bastien (25/03/04)
* to compile without warning and work correctly
*/
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <time.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#define HELLO_PORT 1900
#define HELLO_GROUP "239.255.255.250"
#define MSGBUFSIZE 256
main(int argc, char *argv[])
{
struct sockaddr_in addr;
int fd, nbytes,addrlen;
struct ip_mreq mreq;
char msgbuf[MSGBUFSIZE];
u_int yes=1; /*** MODIFICATION TO ORIGINAL */
/* create what looks like an ordinary UDP socket */
if ((fd=socket(AF_INET,SOCK_DGRAM,0)) < 0) {
perror("socket");
exit(1);
}
/**** MODIFICATION TO ORIGINAL */
/* allow multiple sockets to use the same PORT number */
if (setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,&yes,sizeof(yes)) < 0) {
perror("Reusing ADDR failed");
exit(1);
}
/*** END OF MODIFICATION TO ORIGINAL */
/* set up destination address */
memset(&addr,0,sizeof(addr));
addr.sin_family=AF_INET;
addr.sin_addr.s_addr=htonl(INADDR_ANY); /* N.B.: differs from sender */
addr.sin_port=htons(HELLO_PORT);
/* bind to receive address */
if (bind(fd,(struct sockaddr *) &addr,sizeof(addr)) < 0) {
perror("bind");
exit(1);
}
/* use setsockopt() to request that the kernel join a multicast group */
mreq.imr_multiaddr.s_addr=inet_addr(HELLO_GROUP);
mreq.imr_interface.s_addr=htonl(INADDR_ANY);
if (setsockopt(fd,IPPROTO_IP,IP_ADD_MEMBERSHIP,&mreq,sizeof(mreq)) < 0) {
perror("setsockopt");
exit(1);
}
/* now just enter a read-print loop */
while (1) {
addrlen=sizeof(addr);
if ((nbytes=recvfrom(fd,msgbuf,MSGBUFSIZE,0,
(struct sockaddr *) &addr,&addrlen)) < 0) {
perror("recvfrom");
exit(1);
}
puts(msgbuf);
}
}
关于upnp - 发送M-SEARCH后如何持续监听SSDP响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33917754/
我需要能够发送 UDP 消息并接收消息,以便从 iPhone 发现网络上的 SSDP 设备。 我知道我需要将数据包发送到多播地址,并且我的 HTTP 请求需要如下所示: M-SEARCH * HTTP
我创建了一个简单的 Android 应用程序来扫描我的本地网络;我已将 M-SEARCH 用于此搜索目标: String sentence = "M-SEARCH * HTTP/1.1\r\n"
我经常用谷歌搜索这个问题,但对于我到底想做什么是否可行仍然有点困惑。 基本上,我正在尝试向我的 Web 应用程序添加一个下拉菜单,其中列出了连接到网络的所有设备。当我说设备时,我并不是在谈论所有设备;
这个服务现在用到是非常少的,小编建议大家改为手动使用,这样当我们需要使用它的时候也能使用它,如果你电脑发现这个服务对应的svchost.exe进程使用的CPU非常,可以关闭它,但是不建议直接永久禁用
我希望有人能澄清我对 upnp/ssdp 使用的 NOTIFY 和 M-SEARCH 消息的目的背后的困惑。协议(protocol)。 我的理解是,当设备想要向其他支持 UPNP 的设备宣传自己时会发
我正在实现一个应该响应 SSDP 的设备M-SEARCH查询。 我是设备供应商,我无法控制这些设备的部署位置。 有一种已知的 DDoS 攻击使用 SSDP 搜索放大,即攻击者从虚假地址发送搜索请求,而
我正在尝试进行 SSDP 发现广播,但无法从 NWConnection.receive 获取回复数据。 Network.framework 相对较新,没有太多信息。我在这里缺少什么? SSDP 发现广
我已经在我的 NodeMCU 上运行了 ESP8266SSDP 库,并将其配置如下: SSDP.setSchemaURL("test.xml"); SSDP.setHTTPPort(80); SSDP
我想在网络上搜索我的媒体播放器。我认为它是使用 SSDP m-search 完成的吗? 另外,当我打开设备时,它会广播它的可用性吗?如何收听该广播,以及如何发送 m-search 查询? 最佳答案 I
我正在尝试收听 SSDP 多播消息,例如 NOTIFY 和 SEARCH。 这是我的代码,但我没有看到这些消息,即使 wireshark 看到了它们。那么,如何加入SSDP多播组并接收消息呢? Reb
我正在尝试测试以下 Cordova 插件中存在的 SSDP 实现: https://github.com/fraunhoferfokus/cordova-plugin-hbbtv/tree/maste
我正在使用 SSDP 发送发现请求,使用 M-SEARCH 获取存在的服务列表。我的要求就像我想获得该服务器中也存在的共享文件夹列表。 目前,我正在以这种格式发送此请求: "M-SEARCH * HT
我正在尝试在我的安卓应用中实现一个非常简单的 SSDP 功能 from here . 我的应用程序毫无问题地向广播地址发送了一些包含相关 M-SEARCH 消息的 UDP 数据包。问题是,我应该从其他
我正在尝试创建一个类似 Chromecast 的设备,可以从互联网流式传输视频并进行远程控制。我使用 HTTP get 请求对设备进行远程控制,并使用以下代码监听它们: 监听对设备的 HTTP 请求(
当发出 M-SEARCH 命令时,所有提供服务的设备都必须回复它们提供的服务的 IP 地址。 我的手机有 2 个接口(interface)(除其他外): 192.168.1.5:wifi接口(inte
长话短说:SSDP library没有收到数据报。 Wireshark 显示预期的(?)流量。 我正在使用 android-dlna library在 Android 应用程序中支持 SSDP。目标是
SSDP M搜索发现请求非常适合多播地址239.255.255.250。但是,我有一个要求将此请求发送到特定IP。这没用。根据UPnP architecture document支持单播发现消息,与多
我实现了 discovery using SSDP在我的 Windows 8 应用程序中,一切都很好。我昨天更新到 8.1,现在发现不再有效。现在,当我调用 await socket.GetOutpu
我正在尝试使用 C#Windows 应用商店 应用程序实现基本的 SSDP (UDP) 广播/监听器 em>. 我发现 Windows.Networking.Sockets包含 DatagramSoc
这个问题让我发疯了一段时间。由于我从来没有做过任何网络相关的代码,所以我无法得出这个实验的结果。 我获得了有关使用 SSDP 广播相关信息的服务器的信息。我按照标准获得了 IP 和端口。我还获得了需要
我是一名优秀的程序员,十分优秀!