Sending packets to 255.255.255.255 by Java DatagramSocket fails
Asked Answered
M

4

15

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());
    }
}

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.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());
    }
}

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 is the device I'm using to connect to my mate.

Please make it simple, I'm a newbie :)

Thanks in advance.

Mirador answered 5/7, 2011 at 7:42 Comment(1)
Please show the output of ifconfig!Negligible
F
11

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).

Falbala answered 5/7, 2011 at 7:50 Comment(3)
I added socket.setBroadcast(true) right after socket.connect(...). But it still does not work. What's the problem?Mirador
Thanks. But No, there's no router. It's an ad hoc network. A computer-to-computer one. But it does not work. What is the regular way to broadcast in network?Mirador
The usual way is to setup a multicast server and have the clients to register as multicast clients to the multicast group.Falbala
L
6

Rather than connect your DatagramSocket to the broadcast address, just construct the DatagramPacket to target it, i.e.

DatagramPacket dp = new DatagramPacket(byteArray, byteArray.length, InetAddress.getByName("255.255.255.255"), yourPortNumber);

And like magic, you've sent a broadcast. And then to catch it on the other side, just have that end listening on that port:

DatagramSocket dsock = new DatagramSocket(samePortUsedAbove);
DatagramPacket dp = new DatagramPacket(byteArray, byteArray.length);
dsock.receive(dp);
Lapointe answered 10/1, 2013 at 18:45 Comment(0)
P
3
192.168.1.255 
  • Please check your subnet mask in your network. It might be possible that your sending machine and the receiving machine are not part of the same network.
  • Please check that the receiving machine exists in your network.
  • If there's a router in between your machines, I don't think the message will be transmitted.
Player answered 5/7, 2011 at 10:44 Comment(2)
@Karnahire, At this point of time. I'm sending packets to my own. (by sending packets to "192.168.1.255"). But I can't receive them. But when I send packets to "localhost" it works fine.Mirador
The ip address 192.168.1.255 broadcast doesnot work in case of windows and Mac. I didn't find why ?Player
N
1

If I remember correctly, you cannot receive from broadcast-adresses, but only send to them! So on the receiving side, you must be listening on "your" IP specifically.

Negligible answered 5/7, 2011 at 10:29 Comment(4)
Really ? But how ? I should have a DatagramSocket to send and another DatagramSocket to receive ? And both in same port? I think that's impossible. (I think OS will not allow us to have two sockets with same port)Mirador
@Pro.Hessam, the sender doesn't have to use a particular port, any will do.Negligible
you mean I send packets to port 8030 and receive them from 8027 for example? I made a DatagramSocket connected to 255.255.255.255 and a DatagramSocket connected to localhost one is using port 8030, other is using port 8027. but it's not working. What's the problem?Mirador
@Pro.Hessam: The client listens on 8030. The sender binds to 8027, and sends to 8030. That should work. That would be the basic test. It might even work if source and target PORT are the same, however, the important thing is that you don't listen on 255.255.255.255, but on the REAL local IP. So you will have to use two distinct sockets.Negligible

© 2022 - 2024 — McMap. All rights reserved.