我正在尝试在我的iOS应用程序中创建一个Bonjour服务,但无法将其发布.只netServiceWillPublish调用委托方法,并且使用dns-sd不显示服务.
这是我的代码:
var service: NetService? = nil
func start() {
createSockets()
service = NetService(domain: "test", type: "_test._tcp.", name: "Test", port: Int32(port))
service?.delegate = self
service?.startMonitoring()
service?.publish()
service?.setTXTRecord(NetService.data(fromTXTRecord: [
"model": "AppleTV3,2,1".data(using: .utf8)!,
"srcvers": "160.10".data(using: .utf8)!,
"features": "0x100009FF".data(using: .utf8)!,
"deviceId": "b8:53:ac:43:f3:15".data(using: .utf8)!,
"pw": "0".data(using: .utf8)!,
"rmodel": "MacBookPro10,2".data(using: .utf8)!
]))
}
private func createSockets() {
ipv4Socket = CFSocketCreate(kCFAllocatorDefault, PF_INET, SOCK_STREAM, IPPROTO_TCP, kCFSocketAutomaticallyReenableAcceptCallBack, socketCallback, nil)
var sin = sockaddr_in()
memset(&sin, 0, MemoryLayout<sockaddr_in>.size)
sin.sin_len = __uint8_t(MemoryLayout<sockaddr_in>.size)
sin.sin_family = sa_family_t(AF_INET); /* Address family */ …Run Code Online (Sandbox Code Playgroud) 我正在构建一个在两个iPhone之间发送信息的应用程序.该应用程序运行良好,但我遇到的一个问题是,我无法告诉bonjour是否选择Wi-Fi或蓝牙来建立连接.我想让用户能够选择他们喜欢的.此外,有没有办法以编程方式告诉设备的蓝牙是否开启?
我在Win7 64bit机器上下载并安装了适用于Windows的Bonjour SDK.
我试图在C:\ Program Files\Bonjour SDK\Samples\CS中构建这两个项目.然而,他们都引用了Bonjour,导致我得到以下构建错误'无法加载类型库以供参考"Bonjour".图书馆未注册.
Bonjour似乎安装正确,因为我可以运行Bonjour打印机向导,它似乎正常工作.
知道Visual Studio无法找到库的原因吗?
顺便说一句,我正在使用Visual Studio 2008.
我知道iOS的Bonjour实现(NSNetService,NSNetServiceBrowser)在本地网络上开箱即用.
文档说可以设置Bonjour DNS服务器以允许通过互联网连接用户,所以我的问题是:
谢谢!
我有一个用QT编写的程序,运行得很好.但是它对dnssd.dll有间接依赖,因为程序加载的dll使用了bonjour.如果运行该程序的机器上没有安装bonjour,它会说
程序无法启动,因为您的计算机缺少dnssd.dll.尝试重新安装该程序以解决问题.
我没有通过LoadLibrary或其他方式加载此DLL .我将二进制文件与存根链接起来,以便之前自动加载int main.
显然重新安装程序并不能解决问题.对我而言,它清楚地说我需要安装bonjour,但对于大多数用户来说,这是极其神秘的.
我宁愿将此错误消息更具信息性,例如"需要为此应用程序安装Bonjour才能正常工作,请转到[insert-url-here]下载它."
有没有办法检测dll何时无法加载loke并提供更好的错误消息?
我正在实施一个iPhone/iPad应用程序,允许用户使用bonjour协议发送彼此的消息.基本上,服务器通过bonjour发布他的服务,连接到同一wifi的客户端可以发现他的服务并连接到它以开始发送消息.我发现的问题是有些路由器似乎与Bonjour有问题.在家里或其他地方运行我的应用程序时,它运行得很好.出版和发现的bonjour服务完美无瑕.然而,当我在我朋友的一间公寓试用我的应用程序时,一些(并非所有)客户都无法发现已发布的bonjour服务.我还注意到其他使用Bonjour的应用程序(例如Apple的远程应用程序)在所述网络上也遇到了麻烦.在做了一些挖掘后,我发现其他人在使用bonjour和一些路由器方面遇到了类似的问题.因此我有两个问题:
1)有没有人知道一些路由器似乎有Bonjour的这个问题是一个普遍的问题?换句话说,如果我的应用程序依赖于Bonjour才能运行,我是否必须担心它不会在50%的WLAN网络中运行,或者大多数路由器都没有任何bonjour问题.显然,我不能指望任何人知道每个路由器如何处理bonjour数据包,但也许有一些网络大师可以指出我正确的方向:-p.
2)其次,如果bonjour对于构建我的应用程序的协议风险太大,有哪些替代方案具有类似的功能?我(优选地)需要的特征是服务发布和发现,而无需用户手动输入其他电话的IP地址.
好的,谢谢你的帮助!我知道这是一个广泛的问题,但任何帮助表示赞赏!:)
我在iPhone和Mac之间建立了一个Bonjour网络.
用户在Mac中呈现的表格中选择iPhone的网络服务,并在两侧创建并打开一对流.
iPhone首先向Mac发送代码(整数).Mac成功收到它.
暂停用户输入和处理后,Mac会启动向iPhone发送代码:
NSInteger bytesWritten = [self.streamOut write:buffer maxLength:sizeof(uint8_t)];
// bytesWritten is 1.
Run Code Online (Sandbox Code Playgroud)
但iPhone永远不会获得NSStreamEventHasBytesAvailable事件.我在此之前仔细检查了一下,iPhone的NSInputStream上的streamStatus是2,它应该是NSStreamStatusOpen.
什么想法可能是错的?
更新:我运行了一个测试,其中Mac是第一个向iPhone发送整数的测试.再一次,我从Mac的输出流中获得了1的bytesWritten,但iPhone从未得到过NSStreamEventHasBytesAvailable事件.
所以iPhone的输入流肯定有问题.但我仔细检查:
这是用于创建iPhone输入流的代码.它使用CF类型,因为它是在C风格的套接字回调函数中完成的:
CFReadStreamRef readStream = NULL;
CFStreamCreatePairWithSocket(kCFAllocatorDefault, socketNativeHandle, &readStream, NULL);
if (readStream) {
CFReadStreamSetProperty(readStream, kCFStreamPropertyShouldCloseNativeSocket, kCFBooleanTrue);
server.streamIn = (NSInputStream *)readStream;
server.streamIn.delegate = server;
[server.streamIn scheduleInRunLoop:[NSRunLoop currentRunLoop]
forMode:NSDefaultRunLoopMode];
if ([server.streamIn streamStatus] == NSStreamStatusNotOpen)
[server.streamIn open];
CFRelease(readStream);
}
Run Code Online (Sandbox Code Playgroud)
Update2:响应alastair评论的信息:
套接字选项
retain,release和copyDescription回调设置为NULL.optionFlags设置为acceptCallback.
套接字创建
这是用于在iPhone和Mac上设置套接字的方法,完成了我的评论尝试,以找出此代码中实际发生的事情,该代码改编自各种教程和实验(有效):
/**
Socket creation, port assignment, socket scheduled in run loop.
The socket represents the port on this app's …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用我的Mac和iPhone之间的bonjour和蓝牙建立连接.
我一直在阅读,从这些网站我得知我不能像我第一次尝试那样使用NSNetService.
Bonjour over bluetooth没有Gamekit?
所以我修改了DNSSDObjects示例代码,改为使用kDNSServiceInterfaceIndexP2P标志. DNSSDObjects
但我仍然无法将我的iPhone连接到我的Mac.如果我将标志更改回kDNSServiceInterfaceIndexAny,我可以通过Wifi(lan)建立连接.但是使用蓝牙使用kDNSServiceInterfaceIndexP2P或kDNSServiceFlagsIncludeP2P没有运气.
是否有东西缺失,甚至可以使用bonjour和蓝牙连接OSX和iOS?
大多数IP摄像机是否支持RTSP?
此外,除了使用uPnP和Bonjour之外还有其他方法可以在本地网络上检测IP摄像机吗?
更新到6.3我启动时,Xcode我收到此消息.
知道怎么摆脱这个吗?

编辑:为什么这个问题被搁置?许多人遇到同样的问题..
问题解决了.有关解决方案,请访问: https ://stackoverflow.com/a/29682940/1938719