Java DatagramSocket将数据包发送到255.255.255.255失败 [英] Sending packets to 255.255.255.255 by Java DatagramSocket fails
问题描述
我正在使用java编写网络程序,我想将一些数据包发送到255.255.255.255,但它失败了,即使我将它们发送到192.168.1.255,根据ifconfig命令的输出,它是广播地址。但是当我把它们发送给我的队友的IP时,它运行正常。
I'm programming a networking program in java , and I want to send some Packets to 255.255.255.255, but it fails , even when I send them to 192.168.1.255, which according to the output of ifconfig command , is the broadcast address. But when I send them to my mate's IP it works fine.
以下是我的程序的代码:
Here's the code to my program :
public class StackOverFlow {
public static void main(String[] args) {
Network net= new Network();
Scanner input= new Scanner(System.in);
while(input.hasNext())
net.sendMessage(input.nextLine());
}
}
我使用DatagarmSocket和DatagramPacket这样做,这是我对网络的实现:
I've used DatagarmSocket and DatagramPacket to do so , here's my implementation of the Network :
class Network {
DatagramSocket socket;
public Network() {
try {
socket = new DatagramSocket(8027);
socket.setBroadcast(true);
socket.connect(InetAddress.getByName("255.255.255.255"), 8027);
} catch (Exception e) {
System.err.println("Connection failed. " + e.getMessage());
}
listen();
}
public void listen() {
new Thread() {
public void run() {
while (true) {
try {
byte[] buf = new byte[1000];
DatagramPacket packet = new DatagramPacket(buf,
buf.length);
socket.receive(packet);
String message = new String(buf);
System.out.println("Recieved: " + message);
if (message.equals("end"))
return;
} catch (Exception e) {
System.err.println(e.getMessage());
}
}
}
}.start();
}
public void sendMessage(String message){
byte[] buf= message.getBytes();
DatagramPacket packet= new DatagramPacket(buf, buf.length);
try{
socket.send(packet);
}catch(Exception e){
System.err.println("Sending failed. " + e.getMessage());
}
}
没有异常被抛出。
我在ad hoc网络中。
我正在使用MAC OS X 10.6,而我的伙伴正在使用kubuntu 11.04。
这里是ifconfig输出:
No Exceptions are being thrown.
I'm in an ad hoc network.
I'm using MAC OS X 10.6 while my mate is using kubuntu 11.04.
And here is ifconfig output:
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
inet6 ::1 prefixlen 128
inet6 fe80::1%lo0 prefixlen 64 scopeid 0x1
inet 127.0.0.1 netmask 0xff000000
gif0: flags=8010<POINTOPOINT,MULTICAST> mtu 1280
stf0: flags=0<> mtu 1280
en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
inet6 fe80::21f:f3ff:fed5:4779%en0 prefixlen 64 scopeid 0x4
inet 192.168.1.1 netmask 0xffffff00 broadcast 192.168.1.255
ether 00:1f:f3:d5:47:79
media: autoselect (100baseTX <full-duplex>) status: active
supported media: autoselect 10baseT/UTP <half-duplex> 10baseT/UTP <full-duplex> 10baseT/UTP <full-duplex,hw-loopback> 10baseT/UTP <full-duplex,flow-control> 100baseTX <half- duplex> 100baseTX <full-duplex> 100baseTX <full-duplex,hw-loopback> 100baseTX <full-duplex,flow-control> 1000baseT <full-duplex> 1000baseT <full-duplex,hw-loopback> 1000baseT <full-duplex,flow-control> none
en1: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
inet6 fe80::21d:4fff:feff:2b4d%en1 prefixlen 64 scopeid 0x5
inet 213.233.170.97 netmask 0xfffffc00 broadcast 213.233.171.255
ether 00:1d:4f:ff:2b:4d
media: autoselect status: active
supported media: autoselect
fw0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 2030
lladdr 00:21:e9:ff:fe:bc:79:b2
media: autoselect <full-duplex> status: inactive
supported media: autoselect <full-duplex>
en2: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
ether 00:1f:f3:b6:2c:be
media: autoselect status: inactive
supported media: none autoselect 10baseT/UTP <half-duplex>
vmnet1: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
inet 192.168.149.1 netmask 0xffffff00 broadcast 192.168.149.255
ether 00:50:56:c0:00:01
vmnet8: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
inet 192.168.73.1 netmask 0xffffff00 broadcast 192.168.73.255
ether 00:50:56:c0:00:08
en0是我用来连接我的伴侣的设备。
en0 is the device I'm using to connect to my mate.
请简单,我'新手:)
提前致谢。
推荐答案
使用广播时你需要启用它
While using broadcasting you need to enable it
socket.setBroadcast(true);
另一件事是,如果两台计算机都在,你必须确保你的路由器配置正确两个不同的网。通常默认情况下不会路由广播。此外,如果您的路由器具有无线接口和有线接口,则如果未启用广播,则这些广播可能无效(默认情况下可能存在在这两个接口之间转发广播的硬件)。
Another thing is that you have to make sure that your router is configured right if the two computers are in two different nets. Broadcasts are usually by default not routed. Further if you have a router having a wirless interface and a wired interface these broadcasts may not work either if broadcasts are not enabled(There may be hardware which forward broadcasts between those two interfaces by default).
这篇关于Java DatagramSocket将数据包发送到255.255.255.255失败的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!