在我的debian服务器上(挤压)我每隔几秒钟收到一条消息:
9月18日21:28:14 myhost内核:[7903784.720091] AIF:UNPRIV连接尝试:IN = eth0 OUT = MAC = SRC = my_serverip_eth0 DST = 224.0.0.251 LEN = 72 TOS = 0x00 PREC = 0x00 TTL = 255 ID = 0 DF PROTO = UDP SPT = 5353 DPT = 5353 LEN = 52
数据包来自我的服务器(我用my_serverip_eth0替换),似乎被阻止出去没有目的地224.0.0.251.
所以我的服务器内的一些任务是联系224.0.0.251,这是由我的arnos_firewall阻止的.
如何找出谁试图使用它以及它是否有用?
如果我不需要它,我怎么能压制那个消息呢?
我有一个开发网络服务器托管为"myhost.local",使用Bonjour/mDNS.服务器正在运行avahi-daemon.
网络服务器也想处理自己的任何子域.例如"cat.myhost.local"和"dog.myhost.local"和"guppy.myhost.local".
鉴于myhost.local位于dhcp的动态ip地址上,是否还有办法将子域的所有请求路由到myhost.local?
我开始认为目前不可能......
http://marc.info/?l=freedesktop-avahi&m=119561596630960&w=2
您可以使用/ etc/avahi/hosts文件执行此操作.或者,您可以
使用avahi-publish-host-name.不,他不行.因为他想要定义一个别名,而不是一个新的主机名.即他只想注册A RR,没有反向PTR RR.但是如果你在/ etc/avahi/hosts中粘贴了一些内容,那么它会注册两者,如果PTR RR是非唯一的,则检测到冲突,这就是别名的情况.
我将为iOS和Android创建一个无服务器的本地网络应用程序.iOS和Android设备中的应用程序应该找到并相互通信.
我知道有平台内置服务(自从v4.1开始,它在iOS中是Bonjour,在Android中是NSD),此外,开源jmdns软件包也可以直接使用.
我不知道如何选择以及它们的兼容性如何.
Windows(某些现代风格)是否默认安装和/或运行mDNS服务器?如果是这样,那么如何动态地开始/停止宣传新服务呢?
如果没有标准,那么如何处理试图在该环境中运行多个mDNS服务器的冲突问题?
基本上,我想实现一个可以在Linux,Windows和Mac OS X上运行的服务,并且需要使用mDNS来宣传其zeroconf webserver位置.在Linux上我只使用avahi-publish(或安装配置文件).我猜测答案对于OS X来说是直截了当的.我很难找到Windows的信息.
我注意到一些更好的网络发现应用程序,如Fing for iOS和iNet for Mac能够发现iOS设备和Mac设备的设备名称,即使它们没有宣传Bonjour服务,如iTunes Wi-Fi Sync.这是怎么做到的?我知道如何进行反向mDNS查询https://serverfault.com/questions/143184/how-do-i-get-the-machine-name-from-an-ip-via-multicast-dns.但是反向mDNS查找(至少由dig命令完成)dig -x the.ip @224.0.0.251 -p 5353
)对于没有广播任何Bonjour服务的Mac,它将无效,除非在iOS设备上运行Wi-Fi Sync或其他一些Bonjour服务,否则它无效.我不知道如何获得这个名称,但这些应用程序可靠地得到它.我在iNet发现时使用了Wireshark,我只看到所有返回0个答案的ICMP和NetBios查询.
另请注意,我已经通过广播ping然后解析ARP表来获取设备的IP地址.我想通过获取设备名称并查找字符串"iPhone"或"iPad"来发现以这种方式发现的设备是iOS设备.
另请注意,iNet应用程序网站提供了有关如何撤消IP查找的以下内容.我认为这意味着他们为每个IP执行反向DNS查找和反向mDNS查找.
Reverse IP lookups (hostnames) are performed as unicast and multicast queries for every IP found.
- http://www.bananaglue.de/inet/index_e.php
我正在尝试实现一个类来发现网络上的服务.我曾尝试使用Android的NSD,它确实发现服务很好,但它只支持16级及以上的API级别,而且我似乎无法检索服务信息中的txtRecord字段(由于某种原因它返回null).原来这是一个已知问题......
所以现在我正在尝试使用jmDNS,它似乎根本找不到服务.这是我的班级(我正在使用AndroidAnnotations框架)MDnsHelper:
@EBean
public class MDnsHelper implements ServiceListener {
public static final String SERVICE_TYPE = "_http._tcp.local";
Activity activity;
private JmDNS jmdns;
private MulticastLock multicastLock;
WifiManager wm;
InetAddress bindingAddress;
boolean isDiscovering;
public void init(Activity activity) {
this.activity = activity;
isDiscovering = false;
wm = (WifiManager) activity.getSystemService(Context.WIFI_SERVICE);
multicastLock = wm.createMulticastLock(activity.getPackageName());
multicastLock.setReferenceCounted(false);
}
@Background
public void startDiscovery() {
if (isDiscovering)
return;
System.out.println("starting...");
multicastLock.acquire();
try {
System.out.println("creating jmdns");
jmdns = JmDNS.create();
System.out.println("jmdns created");
} catch (IOException e) {
e.printStackTrace(); …
Run Code Online (Sandbox Code Playgroud) 我正在尝试在我公司的专有硬件设备上执行服务发现,该设备拥有自己的WiFi网络,并在该网络上宣传一项bonjour服务.当我连接到那个WiFi网络时,我正在使用NSD来发现该服务并解决它.
代码非常简单,通常效果很好而且很快.除了我有一个相当反复出现的问题(10次尝试中有5次)到目前为止本地化我的三星S8 +.到目前为止无法在S6或Pixel XL上重现.
问题是DiscoveryListener除了onDiscoveryStarted()之外从未做过任何事情,它只是永远运行.如果我杀了应用程序并重新开始,有时候它会继续挂起.
这就像有一个被阻塞的线程或东西,但是在日志中没有有用的信息(我能找到),而且我还没有发现任何东西可以锁定,因为我可以做些什么来从中恢复.
我添加了一个超时,它将在30秒后停止监听器,但通常在我重试之后它仍然无效.
服务发现过程包含在LiveData中,LiveData在活动时启动.
const val SERVICE_TYPE_FOO = "_foo._tcp."
private val serviceDiscoveryListener = ServiceDiscoveryListener()
override fun onActive() {
super.onActive()
stopRunnable = StopDiscoveryRunnable()
nsdManager.discoverServices(
SERVICE_TYPE_FOO,
NsdManager.PROTOCOL_DNS_SD,
serviceDiscoveryListener
)
handler.postDelayed(stopRunnable, SERVICE_DISCOVERY_TIMEOUT_MS)
}
private lateinit var stopRunnable: Runnable
private inner class StopDiscoveryRunnable : Runnable {
override fun run() {
try {
nsdManager.stopServiceDiscovery(serviceDiscoveryListener)
Timber.w("service discovery timed out")
postValue(ServiceDiscoveryState.Error)
} catch (e: Throwable) {
// no-op
}
}
}
Run Code Online (Sandbox Code Playgroud)
听众很简单......
private inner class ServiceDiscoveryListener : NsdManager.DiscoveryListener {
override fun onServiceFound(serviceInfo: NsdServiceInfo?) …
Run Code Online (Sandbox Code Playgroud) 一旦通过DNS-SD发现服务,该主机的地址究竟如何得到解决,是否需要更多的时间/开销?
另外,如果我使用JmDNS或Bonjour有回调两个serviceFound
和serviceResolved
.如果我在设备发布某种服务的IP地址只是感兴趣,有没有获得比通过两个要去的地址更快/更有效的方式serviceFound
和serviceResolved
?
谢谢
Avahi通常用于服务发现.我想从不同的子网中发现一个服务,我可以使用avahi来实现这个目标吗?
例如,服务主机ip为"192.168.1.100",掩码为"255.255.255.0",因此它位于192.168.1.X子网中.另一个主机IP是"192.168.2.100",掩码为"255.255.255.0".我可以使用avahi让这个主机发现以前的服务主机吗?
我有这个示例Node.js脚本:
var mdns = require('mdns');
var browser = mdns.createBrowser(mdns.tcp('http'));
browser.on('error', function (error) {
console.log("error");
console.log(error);
});
browser.on('serviceUp', function (service) {
console.log("serviceUp");
console.log(service);
});
browser.start();
Run Code Online (Sandbox Code Playgroud)
在我的Mac上它工作正常,找到了两个服务.如果我在运行Raspbean的Raspberry PI 2上运行完全相同的脚本(连接到同一网络),我得到这个输出:
pi@raspberrypi ~ $ node mdns.js
*** WARNING *** The program 'node' uses the Apple Bonjour compatibility layer of Avahi.
*** WARNING *** Please fix your application to use the native API of Avahi!
*** WARNING *** For more information see <http://0pointer.de/avahi-compat?s=libdns_sd&e=node>
*** WARNING *** The program 'node' called 'DNSServiceRegister()' which …
Run Code Online (Sandbox Code Playgroud)