- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要能够发送 UDP 消息并接收消息,以便从 iPhone 发现网络上的 SSDP 设备。
我知道我需要将数据包发送到多播地址,并且我的 HTTP 请求需要如下所示:
M-SEARCH * HTTP/1.1
Host: 239.255.255.250:1900
Man: ssdp:discover
Mx: 3
ST: "urn:schemas-upnp-org:device:InternetGatewayDevice:1"
从阅读文档来看,我似乎可以使用 CFNetwork 完成所有这些工作,尽管阅读(并重新阅读文档)我仍然很难开始。谁能推荐教程或代码片段来帮助我克服最初的学习困难?
我有 CFNetwork 编程指南:
http://developer.apple.com/mac/library/documentation/Networking/Conceptual/CFNetwork/CFNetwork.pdf
和 Beej 的使用 Internet 套接字进行网络编程的指南:
谢谢
戴夫
附注
在此实例中我无法使用任何第三方库和框架。
最佳答案
我已成功使用 AsyncUdpSocket 来运行 SSDP Discovery 并查找 Controller 。这是我的代码片段:
初始化并设置套接字:
// AsyncUdpSocket *ssdpSock = [[AsyncUdpSocket alloc] initWithDelegate:self];
AsyncUdpSocket *ssdpSock = [[AsyncUdpSocket alloc] initIPv4];
[ssdpSock setDelegate:self];
注意第一行已被注释掉。我在AsyncUdpSocket forums上找到的一些重复的问题。我不认为我面对的是他们,但我还是这么做了。
我添加了错误检查,它很有用,因为在调试期间我没有关闭套接字,并且开始出现套接字设置失败:
NSError *socketError = nil;
if (![ssdpSock bindToPort:1900 error:&socketError]) {
NSLog(@"Failed binding socket: %@", [socketError localizedDescription]);
return statusController;
}
if(![ssdpSock joinMulticastGroup:@"239.255.255.250" error:&socketError]){
NSLog(@"Failed joining multicast group: %@", [socketError localizedDescription]);
return statusController;
}
if (![ssdpSock enableBroadcast:TRUE error:&socketError]){
NSLog(@"Failed enabling broadcast: %@", [socketError localizedDescription]);
return statusController;
}
[ssdpSock sendData:[self.discoverControllerString dataUsingEncoding:NSUTF8StringEncoding]
toHost:@"239.255.255.250"
port:1900
withTimeout:2
tag:1];
请注意我对超时所做的更改。最后完成接收设置,并关闭套接字。注意 socket 关闭。由于当我运行此代码时我在自己的类(class)中 - 上面的代码对我不起作用。
[ssdpSock receiveWithTimeout: 2 tag:1];
[NSTimer scheduledTimerWithTimeInterval: 5 target: self
selector:@selector(completeSearch:) userInfo: self repeats: NO];
[ssdpSock closeAfterSendingAndReceiving];
最重要的变化可能是如果我没有找到我的 Controller ,则返回“NO”。第一次接收顺便是发现消息本身返回。当我仔细阅读 AsyncUdpSocket.h 文件时 - 当它不是您正在寻找的数据包时返回“NO”有帮助。
另请注意,我在代码中使用 ARC,但编译的 AsyncUdpSocket 没有 ARC 支持。
-(void) completeSearch: (NSTimer *)t
{
NSLog(@"%s",__FUNCTION__);
//[ssdpSock close];
//ssdpSock = nil;
}
- (BOOL)onUdpSocket:(AsyncUdpSocket *)sock
didReceiveData:(NSData *)data
withTag:(long)tag
fromHost:(NSString *)host
port:(UInt16)port
{
NSLog(@"%s %ld %@ %d",__FUNCTION__,tag,host,port);
NSString *aStr = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
NSLog(@"%@",aStr);
NSString *compareString = [aStr stringByPaddingToLength:[self.responseString length] withString:@"." startingAtIndex:0];
//NSLog(@"%@", compareString);
//NSLog(@"%@", self.responseString);
if ([compareString isEqualToString:self.responseString])
{
NSLog(@"String Compare, Controller Found!");
[self.controllerList addObject:aStr];
//NSData *controllerIP = [aStr dataUsingEncoding:NSUTF8StringEncoding];
[[NSNotificationCenter defaultCenter] postNotificationName:@"DiscoveredController" object:nil];
return YES;
}
return NO;
}
关于iphone - iPhone 上的 SSDP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3192989/
我需要能够发送 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 和端口。我还获得了需要
我是一名优秀的程序员,十分优秀!