我的工作是开发适用于零售环境的网络摄像头软件。我的团队正在开发的软件之一是一个网络服务器,它可以检索由相机本身(具有自己的嵌入式网络服务器)在HTML中生成并存储在相机上的各种报告。我们的软件将从相机获取这些报告并将其存储在中央网络服务器上。奇数InetAddress.isReachable()问题
虽然我们很好地将摄像机的IP插入到我们的软件中,但我正在开发一个简单的Java类,它将查询网络并查找网络上的所有摄像机。
但问题是,虽然它在我的PC和我的同事的个人电脑上运行得很好,但是当我们尝试在将托管我们的软件的实际网络服务器PC上运行时...它运行,但是说每个IP除网关IP外,该子网是脱机/不可访问的。例如,如果我从我的PC或我的同事PC上运行它,当插入到封闭的局域网时,我会得到以下活动IP以及一个标志,告诉我它是不是一个摄像头。 (网关是192.168.0.1,子网掩码为255.255.255.0,这意味着要被搜索的256个器件全范围)
IP:/192.168.0.1 Active:true Camera:false
IP:/192.168.0.100 Active:true Camera:true <- this is camera 1
IP:/192.168.0.101 Active:true Camera:true <- this is camera 2
IP:/192.168.0.103 Active:true Camera:false <- my PC
IP:/192.168.0.104 Active:true Camera:false <- this is our webserver
但由于某些原因,从运行的网络服务器PC相同的程序时,使用同样的JRE,我只得到以下发现
IP:/192.168.0.1 Active:true Camera:false
现在我的代码,而不是通过每一个IP,以便在主线程枚举,而不是创建一个单独的线程用于进行检查每个IP,并同时运行它们(否则在5000ms/IP的超时时间内枚举整个IP范围将花费超过21分钟)。主线程然后每隔15秒重复运行这些IP扫描线程。
我已经检查过所有线程都在所有PC上运行完成,没有任何异常被抛出。甚至证实没有任何线程卡住。每个线程从开始到完成需要大约5001到5050ms,并且那些具有活动IP的线程更早完成(> 5000ms),所以我知道它正确地在ipAddr.isReachable(5000)方法中等待完整的5000ms。
我和我的同事在这一点上很难过,虽然它似乎在我们的PC上运行时达到了那些活跃的IP,但是却没有从网络服务器PC得到回应?
我们已经排除了防火墙问题,管理员权限的问题,等等。唯一的区别是,我们的Web服务器嵌入式Win XP的,而我们的PC是Windows 7的
这难倒我们。任何想法为什么?
下面是运行的每个IP线程代码:
public void CheckIP() {
new Thread() {
@Override
public void run() {
try {
isActive = ipAddr.isReachable(5000);
if (isActive) {
if (!isCamera) {
isCamera = new IpHttpManager().GetResponse(ipAddr.toString());
}
} else {
isCamera = false;
}
} catch (Exception e) {
e.printStackTrace();
}
}
}.start();
}
编辑:这是建立每个IP:基于网关和子网范围后检查代码...
for(int i=subMin; i<=subMax; i++) {
byte[] ip = new byte[] {(byte)oct[0],(byte)oct[1],(byte)oct[2],(byte)i};
try {
scanners[subCount] = new IpScan(InetAddress.getByAddress(ip));
subCount++;
} catch (UnknownHostException e) {
e.printStackTrace();
}}
可以从你的网络服务器ping您的机器吗? – BevynQ
你使用Wireshark做过任何网络跟踪吗?这是最好的起点。将它安装在服务器上,并确定数据包是否发送到正确的接口,以及是否有任何响应。我想流量正在通过切换到相机。将一台带有Wireshark的笔记本电脑连接到tap/mirror端口并查看数据包的位置。 –
@BevynQ是的,我可以ping它。在吉姆:将检查出来。我也曾想过同样的事情,即从Web服务器发送的数据包是不同的。 – Jgregoire108