[英]Sending packets to 255.255.255.255 by Java DatagramSocket fails
我正在java中編寫一個網絡程序,我想向255.255.255.255發送一些數據包,但是它失敗了,即使我將它們發送到192.168.1.255,根據Z78E6221F6393D1356681DB398F14CE6的廣播地址。 但是當我將它們發送給我伴侶的 IP 時,它工作正常。
這是我的程序的代碼:
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 來做到這一點,這是我的網絡實現:
class Network {
DatagramSocket socket;
public Network() {
try {
socket = new DatagramSocket(8027);
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());
}
}
沒有拋出異常。
我在一個自組織網絡中。
我使用的是 MAC OS X 10.6,而我的伙伴使用的是 kubuntu 11.04。 這是 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 是我用來連接到我的伙伴的設備。
請簡單點,我是新手:)
提前致謝。
使用廣播時,您需要啟用它
socket.setBroadcast(true);
另一件事是,如果兩台計算機位於兩個不同的網絡中,您必須確保您的路由器配置正確。 廣播通常默認不路由。 此外,如果您的路由器具有無線接口和有線接口,則如果未啟用廣播,這些廣播也可能不起作用(默認情況下,可能有硬件在這兩個接口之間轉發廣播)。
而不是將您的 DatagramSocket 連接到廣播地址,只需構造 DatagramPacket 以定位它,即
DatagramPacket dp = new DatagramPacket(byteArray, byteArray.length, InetAddress.getByName("255.255.255.255"), yourPortNumber);
就像魔術一樣,你發送了一個廣播。 然后要在另一邊捕捉它,只需讓那一端在該端口上偵聽:
DatagramSocket dsock = new DatagramSocket(samePortUsedAbove);
DatagramPacket dp = new DatagramPacket(byteArray, byteArray.length);
dsock.receive(dp);
192.168.1.255
如果我沒記錯的話,你不能從廣播地址接收,而只能發送給他們,所以在接收端。 您必須專門收聽“您的” IP。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.