我有一个节点 webkit 应用程序,它使用 mdns 模块从 Mac(使用 Mavericks)发布 Bonjour 服务。当我运行服务器代码时node server.js一切正常,但是当运行使用相同服务器代码的节点 webkit 应用程序时,我收到此错误:
"Uncaught Error: dlopen(/Users/me/myfolder/node_modules/mdns/build/Release/dns_sd_bindings.node, 1): no suitable image found. Did find:
/Users/me/myfolder/node_modules/mdns/build/Release/dns_sd_bindings.node: mach-o, but wrong architecture", source: /Users/me/myfolder/node_modules/mdns/lib/dns_sd.js (35)
Run Code Online (Sandbox Code Playgroud)
显然,当您安装该mdns模块时npm,它是为 x86 架构构建的,而我需要它用于 i386,因为 node-webkit 是为 i386 构建的(我通过阅读此线程发现了这一点: http: //forums.macrumors.com/showthread .php?t=879780 )。您可以通过在终端中运行以下命令来验证它:
$ lipo -info /Applications/node-webkit.app/Contents/MacOS/node-webkit
Non-fat file: /Applications/node-webkit.app/Contents/MacOS/node-webkit is architecture: i386
Run Code Online (Sandbox Code Playgroud)
我发现这个链接建议了一个解决方案:https://github.com/rogerwang/node-webkit/issues/296对于另一个模块(节点代理)。建议的说明是:
I managed to build a 32-bit version of node-proxy as follows:
I installed nw-gyp
I ran nw-gyp configure --target=0.3.6 …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 Swift 中的 Network.framework 为我的 iOS 应用程序获取在本地网络上运行的 Bonjour 服务列表。为了发现与我的应用程序运行时使用相同协议版本的设备,我需要能够查看网络上运行的 Bonjour 服务的 TXT 记录。但是,当我尝试打印时result.endpoint.txtRecord总是返回零。
下面是我的代码示例(经过简化以重点关注此示例的关键部分):
let parameters = NWParameters.tcp
parameters.includePeerToPeer = true
parameters.allowLocalEndpointReuse = true
let browser = NWBrowser(for: .bonjour(type: "_tictactoe._tcp", domain: nil), using: parameters)
browser.browseResultsChangedHandler = { results, changes in
for result in results {
print("Browser result. txtRecords: \(result.endpoint.txtRecord)")
}
}
Run Code Online (Sandbox Code Playgroud) 我想要做的是在我的ipod touch上启用一个简单的bonjour服务.在我发布我的自定义bonjour服务后,委托人没有得到"netServiceDidPublish:"调用.我还检查"netService:(NSNetService*)sender didNotPublish:"中没有任何错误消息.以下是我的代码部分:
// AsyncSocket class comes from an awesome project: cocoa async socket.
// http://code.google.com/p/cocoaasyncsocket/
AsyncSocket* listenSocket;
listenSocket = [[AsyncSocket alloc] initWithDelegate:self];
NSError *error;
if (![listenSocket acceptOnPort:0 error:&error])
{
NSLog(@"Error starting server: %@", error);
return NO;
}
int port = [listenSocket localPort];
NSLog(@"Server started on port: %hu", port);
isRunning = YES;
// register itself to bonjour service.
netService = [[[NSNetService alloc] initWithDomain:@"local."
type:@"_sampleservice._tcp"
name:@"myservice"
port:port] autorelease];
if (!netService)
{
NSLog(@"Failed to enable net service");
[listenSocket disconnect];
return NO;
} …Run Code Online (Sandbox Code Playgroud) 我试图在macOS 10.13中宣传具有Multipeer Connectivity的服务:
override init() {
self.serviceAdvertiser = MCNearbyServiceAdvertiser(peer: peerID, discoveryInfo: nil, serviceType: serviceID);
super.init();
self.serviceAdvertiser.delegate = self;
self.serviceAdvertiser.startAdvertisingPeer();
}
Run Code Online (Sandbox Code Playgroud)
哪里
private let serviceID = "sample-test";
private let peerID = MCPeerID(displayName: Host.current().localizedName!);
Run Code Online (Sandbox Code Playgroud)
调用广告客户端的调用方法会立即失败,而不是让正确的委托回调方法失败,这就是我在控制台中获得的内容:
2017-10-16 11:22:35.568607-0700 macApp[3060:288948] [] tcp_listener_socket_create bind(fd 3) failed: [1] Operation not permitted
2017-10-16 11:22:35.569223-0700 macApp[3060:288940] [MCNearbyServiceAdvertiser] Server did not publish: errorDict [{
NSNetServicesErrorCode = 1;
NSNetServicesErrorDomain = 1;
}].
Run Code Online (Sandbox Code Playgroud)
不知道怎么解决这个问题?
更新:
在iOS模拟器中运行完全相同的代码工作正常,所以我猜它与Mac机器上的某些权限有关.
看到日志显示这是一个权限问题,我继续在Mac上启用root用户,并尝试运行相同的代码无济于事.
我正在考虑关闭系统完整性保护,但我很难接受Apple如果要使用所有这些安全性妥协而发布此框架的事实.会继续调查.
我有一个关于如何在 iOS 14 上设置 UDP 侦听器的问题。我有一个 UDP 侦听器,该侦听器过去一直有效,但更新到 iOS 14 后,它偶尔有效/根本无效。
\n它位于 NSObject 中,并在端口 15000(无特定 IP 地址)上侦听本地网络上的 UDP 广播。它使用 CocoaAsyncSocket 库。当我调用setUpSocket()本地网络权限时,不会触发,但应用程序能够偶尔拾取 UDP 数据包。
\nvar socket: GCDAsyncUdpSocket?\nvar broadcastPort: UInt16 = 15000\nvar broadcastAddress: String = ""\nvar connectAddress = ""\nvar connectPort = 0\n\nfunc setUpSocket() {\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0findUDP()\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0let socket = GCDAsyncUdpSocket(delegate: self, delegateQueue: DispatchQueue.main)\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0socket.setIPv4Enabled(true)\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0socket.setIPv6Enabled(false)\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0do {\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0try socket.bind(toPort: broadcastPort) /*15000*/\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0try socket.enableBroadcast(false)\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0try socket.beginReceiving()\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0} catch let error as NSError {\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0print("Issue with setting up listener \\(error)")\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0}\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\n\xc2\xa0\xc2\xa0}\n\n/*Called when UDP packets are received.*/\nfunc udpSocket(_ sock: GCDAsyncUdpSocket, didReceive data: Data, …Run Code Online (Sandbox Code Playgroud) 我一直在尝试正确添加Apple提供的开源dns_sd.h库.我正在编写一个使用BonjourRegistrar类的程序,如下所示: 链接文本
我已经在Mac环境中编写了我的程序,现在我正在尝试将其移植到Windows.Bonjour SDK附带了几个类,我对如何正确地将类添加到我的Qt项目感到困惑.我试过添加一行:
win32:LIBS += c:\dnsssd.lib
Run Code Online (Sandbox Code Playgroud)
在.pro文件中没有成功.此外,我试图将dns_sd.h和dns_sd.c文件添加到我的项目中,并得到一些错误,例如:
'UINT8':没有命名类型'INT8':没有命名类型'UINT16'没有命名类型'INT16'没有命名类型
最后,我现在尝试在此链接链接文本中修改xcimo所描述的lib文件
我不知道我是否使用正确的命令来正确修改这些文件.
我正在为推特网络课程的P2P Twitter客户端工作.我试图给我的同伴一个注册自己的方式,以便其他同行可以发现它.我正在创建一个DNS TXT记录,以便我可以调用DNSSD.Register().但是,当调用此方法时,我收到一条错误,内容如下:
导致此错误的原因(java):"位置0x0的内存访问无效rip = 0x106282bae"
以下是导致它的方法:
import com.apple.dnssd.*;
public static void announce()throws com.apple.dnssd.DNSSDException{
TXTRecord txtRec = new TXTRecord();
txtRec.set("Version", "1.1");
txtRec.set("EncryptionSupport", "false");
txtRec.set("DisplayName", profile.getPropertyValue("UserName"));
txtRec.set("UserID", profile.getPropertyValue("UserID"));
RegisterListener myRegisterListener = null;
DNSSDRegistration reg = null;
RegisterListener myRegistrationListener = null;
reg = DNSSD.register
(0, DNSSD.ALL_INTERFACES, profile.getPropertyValue("UserName"),
profile.getPropertyValue("DNSSDServiceName"),
null, null, 4444, txtRec, myRegistrationListener);
}
Run Code Online (Sandbox Code Playgroud)
"reg = ..."行是导致错误发生的行.关于我做错了什么的任何想法?其中很多都来自我不完全理解的例子.
我想在2个iOS设备(iPhone或iPad)之间进行数据共享(可能xml或json文件),并且通信一次就像"一对多双向".
通过一些经验和文章,我发现了以下方法.
有人可以建议最好的方式来满足我的要求,这是一个很好的方法吗?
我已经尝试了很长时间,让NsdManager发现功能在Android 9上运行。它可以在此之前的任何Android版本上正常运行。
为了进行测试,我使用了这个简单的代码段,清单中有“ INTERNET”的权限。
var nsdManager = context.getSystemService(Context.NSD_SERVICE) as NsdManager
nsdManager.discoverServices("_https._tcp", NsdManager.PROTOCOL_DNS_SD, object: NsdManager.DiscoveryListener {
override fun onDiscoveryStarted(serviceType: String?) {
println("DEBUG: onDiscoveryStarted $serviceType")
}
override fun onDiscoveryStopped(serviceType: String?) {
println("DEBUG: onDiscoveryStopped $serviceType")
}
override fun onServiceFound(serviceInfo: NsdServiceInfo?) {
println("DEBUG: onServiceFound $serviceInfo")
}
override fun onServiceLost(serviceInfo: NsdServiceInfo?) {
println("DEBUG: onServiceLost $serviceInfo")
}
override fun onStartDiscoveryFailed(serviceType: String?, errorCode: Int) {
println("DEBUG: onStartDiscoveryFailed $serviceType $errorCode")
}
override fun onStopDiscoveryFailed(serviceType: String?, errorCode: Int) {
println("DEBUG: onStopDiscoveryFailed $serviceType $errorCode")
}
})
Run Code Online (Sandbox Code Playgroud)
当执行此代码时,我在日志中看不到任何调试或错误消息。
使用Wireshark,我可以看到广播的mDNS Standard查询“ _https._tcp.local”以及来自所有预期设备的所有相应响应。由于从未调用过函数“ …
我正在尝试在iOS设备和Mac之间建立Bonjour连接.发现彼此工作很好,但我遇到了问题setTXTRecordData:.它总是失败(BOOL返回NO)......
_serviceInstances创建:
-(void)netServiceBrowser:(NSNetServiceBrowser *)aNetServiceBrowser didFindService:(NSNetService *)aNetService moreComing:(BOOL)moreComing
{
[aNetService retain];
[aNetService setDelegate:self];
[aNetService startMonitoring];
[aNetService performSelectorOnMainThread:@selector(resolve) withObject:nil waitUntilDone:YES];
[_serviceInstances addObject:aNetService];
}
Run Code Online (Sandbox Code Playgroud)
发送尝试:
NSNetService*service = [_serviceInstances objectAtIndex:[servicesTable selectedRow]];
[service setDelegate:self];
NSDictionary*txtRecordDataDictionary = [NSDictionary dictionaryWithObject:@"2" forKey:@"Version"];
if (service)
{
BOOL success = [service setTXTRecordData:[NSNetService dataFromTXTRecordDictionary:txtRecordDataDictionary]];
if (!success)
{
NSRunCriticalAlertPanel(@"Sync Error", @"Failed to contact Client. Please restart Carbon on your iPad and try again.", @"OK", nil, nil);
}
NSLog(@"Service: %@",service);
}
Run Code Online (Sandbox Code Playgroud)
NSLog消息输出Service: <NSNetService 0x441b40> local. _test._tcp. David's iPad正确.
iOS代码: …
我使用pidgin,A,B和C运行多个bonjour客户端.
当B和C与A通信时,我发现A使用相同的端口(通过wireshark我可以看到数据包)用于MDNS和通信,
但是B和C,每个有两个不同的端口,一个用于MDNS,一个用于套接字连接.
A如何工作,为什么它只能与一个端口一起工作?一个端口如何提供多个连接?
注意:如果它是多线程的,那么当它接受连接时它会创建一个带有另一个空闲端口的新套接字,但我看到来自wireshark的数据包,客户端A只使用相同的端口进行通信和MDNS.
bonjour ×11
ios ×3
mdns ×3
swift ×3
objective-c ×2
airdrop ×1
android ×1
data-sharing ×1
gyp ×1
ios14 ×1
iphone ×1
java ×1
macos ×1
networking ×1
node-webkit ×1
node.js ×1
nsdmanager ×1
nsnetservice ×1
one-to-many ×1
p2p ×1
port ×1
qt ×1
sockets ×1
udp ×1
windows ×1