通过AppStore升级到Yosemite 10.10(没有新的/干净安装)后,在使用Codekit 2预览网站时,我得到一个空白页面.在"服务器"选项卡中,我的案例中的Bonjour主机名"lukas.local"缺失,因为升级http://goo.gl/QduPqp.
有关如何再次正确公开我的Bonjour主机名的任何想法?谢谢!
我想让用户轻松将NAT上的端口转发到我的C++应用程序的本地机器上.我想在OSX和Windows上做这个工作.Linux将是一个很好的奖励,但Linux用户可能更容易手动转发端口,所以它不是一个问题.LGPL类型代码没问题,但我不能使用任何直接GPL.
我很想听听任何人在这个领域有过的想法或经历,但我想到了一些具体的问题:
在我看来,DNS的许多问题,特别是安全问题,都是通过UDP实现DNS的根本原因; 例如,响应者不必是他所说的那个人.
我不知道mDNS协议的细节(我假设它比DNS更新),也许它在应用程序级别处理这些问题.任何人都可以为我阐明这一点吗?
我的程序是我的第一个真正的Erlang程序,我已经有了一个良好的开端.我让它听取消息,阅读它们并解析它们.我也发送它们.困扰我的一件小事是我不能在5353号港口发送,我已经尝试了一切.我的机器上的所有其他应用程序都可以通过端口5353,SubEthaEdit,iTunes,iChat进行监听和发送.
解决方案必须在端口5353上广播发送,这就是原因.
"如果收到的多播DNS查询中的源UDP端口不是端口5353,则表示发起查询的客户端是一个不能完全实现所有多播DNS的简单客户端.在这种情况下,多播DNS响应者必须发送一个UDP响应通过单播直接返回到客户端查询数据包的源IP地址和端口.这种单播响应必须是传统的单播DNS服务器生成的传统单播响应;例如,它必须重复查询ID以及查询包中给出的问题."
它们都在发送多播消息时报告端口:5353.我真的希望我的应用程序玩得很好并做同样的事情,发送端口5353.这是我现在的模块.
-module(zeroconf).
-include("zeroconf.hrl").
-export([open/0,start/0]).
-export([stop/1,receiver/0]).
-export([send/1]).
-define(ADDR, {224,0,0,251}).
-define(PORT, 5353).
send(Domain) ->
{ok,S} = gen_udp:open(0,[{broadcast,true}]), % I really want this Port to be 5353 :-(
% this doesn't complain or throw errors but it also doesn't work :-(
%{ok,S} = gen_udp:open(?PORT,[{reuseaddr,true}, {ip,?ADDR}, {broadcast,true},multicast_ttl,4}, {multicast_loop,false}, binary]),
P = #dns_rec{header=#dns_header{},qdlist=[#dns_query{domain=Domain,type=ptr,class=in}]},
gen_udp:send(S,?ADDR,?PORT,inet_dns:encode(P)),
gen_udp:close(S).
Run Code Online (Sandbox Code Playgroud)
这是一些输出的样子.
这是来自SubEthaEdit的QUERY,在本地网络上查找其他实例,请注意它显示Port:5353
From: {192,168,0,105}
Port: 5353
Data: {ok,{dns_rec,{dns_header,0,true,'query',true,false,false,false,false,0},
[],
[{dns_rr,"_see._tcp.local",ptr,in,0,0,
"jhr@Blackintosh._see._tcp.local",undefined,[],
false}],
[],[]}}
Run Code Online (Sandbox Code Playgroud)
现在这是我的模块中查询本地网络上的iTunes实例,注意它说Port:59795代码就像现在一样,该端口是随机的.我真的希望它是5353.
From: {192,168,0,105}
Port: 59795
Data: {ok,{dns_rec,{dns_header,0,false,'query',false,false,false,false,false,
0},
[{dns_query,"_daap._tcp.local",ptr,in}],
[],[],[]}}
Run Code Online (Sandbox Code Playgroud)
有没有人对UDP多播有任何神秘的见解?更新所以我可以尝试接受答案.我想我不能这样做.
我有一个通过Bonjour发布的iPhone应用程序.Mac对应物可以工作,它们可以同步和交换数据.现在我必须将那个小Mac应用程序移植到Windows.我决定使用.NET(因为这就是我所知道的).
该应用程序并不复杂,但我还处于早期阶段.我需要浏览/发现Bonjour服务.为此,我下载了Mono.Zeroconf和Apple的最新SDK(其中包括几个C#样本).
我并没有真正粘贴代码,因为我真的要复制/粘贴样本.实际上,Mono.Zeroconf有一个MZClient.exe,可用于测试"所有API".
我的第一个测试是 - 在同一个盒子里 - 打开两个cmd.exe并启动一个MZclient注册服务,另一个,启动它并"发现它".
它不起作用.
这是服务器:
C:\MZ>MZClient -v -p "_http._tcp 80 mysimpleweb”
*** Registering name = 'mysimpleweb', type = '_http._tcp', domain = 'local.'
*** Registered name = ‘mysimpleweb’
Run Code Online (Sandbox Code Playgroud)
在另一个终端:
c:\MZ>MZClient -v -t "_http._tcp"
Creating a ServiceBrowser with the following settings:
Interface = 0 (All)
Address Protocol = Any
Domain = local
Registration Type = _http._tcp
Resolve Shares = False
Hit ^C when you're bored waiting for responses.
Run Code Online (Sandbox Code Playgroud)
就是这样.什么都没发生.我当然试过不同的服务无济于事.甚至玩那个领域的东西.记住这是同一个盒子.我尝试了另一台计算机,因为这是OSX中的一个虚拟机,所以我继续尝试了一个"纯粹的"胜利XP.没有.
注意:我有Apple Bonjour服务(启动并运行)以及Apple SDK(稍后安装).
鉴于这不起作用,我继续并决定尝试使用具有Interop和一些预编译样本(及其源代码)的Apple SDK.
简短的故事,mDSNBrowser.exe和SimpleChat.exe都不工作/查看/发现任何东西.
我的盒子是Parallels下的Win7,但这似乎并没有影响任何东西,因为原生XP表现出同样的问题. …
我需要的是在这个Mac应用程序中有一个简单的屏幕,只需打印一个字符串,因为iPhone正在通过WiFi网络传输字符串.
该字符串只是来自用户在iPhone上上下调整的滑块的字符串值.数据将被发送到Mac应用程序,然后Mac应用程序将从WiFi网络接收此信号并简单地打印值.
这是一个持续的连接.我不想尝试同步一次.我正试图从Mac上听iPhone设备,看看当用户从iPhone应用程序上下滑动UISlider时,iPhone是否正在发送更多字符串.
我该如何创建客户端?我需要使用Bonjour吗?
我被要求将Apple的Bonjour安装程序捆绑到我们自己的msi安装程序中,以便Bonjour自动安装在我们的软件旁边.有人这样做过吗?它似乎并不是微不足道的,因为msi安装程序不能包含和启动另一个.我假设我需要某种批处理文件来顺序运行这两个安装程序?
我有以下代码用于发现网络上的服务:
[netServiceBrowser setDelegate: self];
[netServiceBrowser searchForServicesOfType: serviceType inDomain: domain];
Run Code Online (Sandbox Code Playgroud)
这导致调用这两种方法(查找服务和删除服务):
- (void) netServiceBrowser:(NSNetServiceBrowser*) netServiceBrowser
didFindService:(NSNetService*) netService ... {}
- (void) netServiceBrowser:(NSNetServiceBrowser*) netServiceBrowser
didRemoveService:(NSNetService*) netService ... {}
Run Code Online (Sandbox Code Playgroud)
这很好用.当我关闭设备时,我立即收到didRemoveService调用.
但是,当我打开流(输入,输出或两者)到设备时:
[netService getInputStream: &inputStream outputStream: &outputStream];
[inputStream setDelegate: self];
[outputStream setDelegate: self];
[inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop]
forMode: NSDefaultRunLoopMode];
[inputStream open];
[outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop]
forMode:NSDefaultRunLoopMode];
[outputStream open];
Run Code Online (Sandbox Code Playgroud)
它突然需要NSNetServiceBrowser几乎一分钟来检测我关闭了设备
(调用didRemoveService需要一分钟).
我没有与之通信的设备(打开流)仍然会在我删除它们后立即调用didRemoveService.
更新: 这里有一些与我的问题相关的信息.
我跟Wireshark跑了一段路,注意到以下几点:
我在iPad模拟器中启动应用程序,应用程序启动NSNetServiceBrowser并检测打印机.之后,它打开输入/输出流到设备(通过机场快递,USB).打印机正在向我发送状态更新,当我点击应用程序中的测试按钮时,打印机开始打印.在Wireshark中,我看到了与打印机的所有通信.
现在,当我在iPad上启动完全相同的应用程序(并让iPad模拟器运行).应用程序也启动NSNetServiceBrowser,并检测打印机.打印机没有向我发送状态更新,当我点击测试按钮时,打印机没有打印.在Wireshark中,我看到了沟通.打印机或机场接收我的命令并发送ACK包.
一旦我杀死iPad模拟器应用程序,打印机就会开始打印我使用iPad发送的命令.似乎打开一个套接字阻止所有的bonjour事件,我怎么能防止这种情况发生?
我在另一台设备上获取连接的服务名称时遇到问题.我正在使用基于Bonjour的NSNetServices以及用于对等连接的输入和输出流.我有一个iPhone和iPad设备.当我尝试从iPhone连接到iPad时,在iPhone端代理回调:
- (void)netService:(NSNetService *)sender didAcceptConnectionWithInputStream:(NSInputStream *)inputStream outputStream:(NSOutputStream *)outputStream
Run Code Online (Sandbox Code Playgroud)
被叫.但这sender只是它自己的服务(iPhone),所以它没有给我任何信息.我认为它应该包含其他设备服务(iPad),因此我们可以将信息保存到我们连接的服务中.你知道我怎样才能得到连接的服务名称?
在Android上,我这样做是用一个简单的attacched地图作为信息来创建一个服务广播
HashMap<String, String> record = new HashMap<>();
record.put("info, "my android info");
WifiP2pDnsSdServiceInfo serviceInfo = WifiP2pDnsSdServiceInfo
.newInstance("_myservice", "_tcp", record);
WifiP2pManager manager = (WifiP2pManager) getSystemService(Context.WIFI_P2P_SERVICE);
Channel channel = manager.initialize(this, this.getMainLooper(), null);
manager.addLocalService(channel, serviceInfo, null);
Run Code Online (Sandbox Code Playgroud)
检索另一个信号
manager.setDnsSdResponseListeners(channel, this, this);
@Override
public void onDnsSdTxtRecordAvailable(String fullDomainName, Map<String, String> txtRecordMap, WifiP2pDevice srcDevice)
Run Code Online (Sandbox Code Playgroud)
在iOS上,它是相同的服务名称和信息地图
MCPeerID* _myPeerId=[[MCPeerID alloc] initWithDisplayName:@"my ios peer"];
NSDictionary* _serviceInfo=@{@"info": @"my ios info"};
MCNearbyServiceAdvertiser* _serviceAdvertiser = [[MCNearbyServiceAdvertiser alloc]
initWithPeer:_myPeerId discoveryInfo:_serviceInfo serviceType:@"myservice"];
_serviceAdvertiser.delegate=advertiseDelegate;
MCNearbyServiceBrowser* _serviceBrowser=[[MCNearbyServiceBrowser alloc]
initWithPeer:_myPeerId serviceType:@"myservice"];
_serviceBrowser.delegate=browserDelegate;
[_serviceAdvertiser startAdvertisingPeer];
[_serviceBrowser startBrowsingForPeers];
Run Code Online (Sandbox Code Playgroud)
和代表们
-(void)browser:(MCNearbyServiceBrowser *)browser …Run Code Online (Sandbox Code Playgroud)