2010-06-01 22 views
6

Mattina.UDP Broadcast in Java

Sono piuttosto nuovo in Java e connessioni socket, ma sto cercando di inviare un pacchetto UDP/broadcast su 255.255.255.255 sulla porta 8001 su un dispositivo. Posso far sì che i dati vengano inviati correttamente, tuttavia quando arriva il momento di ricevere i dati la connessione scade. Ho uno sniffer di pacchetti e posso vedere il pacchetto inviare e poi il dispositivo risponde.

Sono abbastanza sicuro che sia un errore da principiante che mi manca nel mio codice ma sono rimasto bloccato per un po 'e qualsiasi aiuto sarebbe apprezzato.

m_Socket = new DatagramSocket(m_SERVERPORT); 
InetAddress address = InetAddress.getByName(m_SERVERIP); 


m_DataPack = new DatagramPacket(m_SERVERCMD.getBytes(), m_SERVERCMD.getBytes().length, 
address, m_SERVERPORT); 
m_Socket.setBroadcast(true); 
m_Socket.connect(address, m_SERVERPORT); 

m_Socket.send(m_DataPack); 
m_DataPack = new DatagramPacket(data, data.length, 
address, m_SERVERPORT); 


m_Socket.receive(m_DataPack); // This is where it times out 


data = m_DataPack.getData(); 
String received = data.toString(); 
System.out.println("Received: " + received); 
m_Socket.close(); 

Grazie e Gig'Em.

EDIT:

Non sono sicuro se questo aiuta, ma quando guardo l'oggetto m_Socket posso vedere il seguente destra prima di inviare:

bound = true; 
close = false; 
connectedAddress = Inet4Address (id = 32) (-1,-1,-1,-1); 
connectedPort = 8001; 
connectState = 1; 
created = true; 
impl = PlainDatagramSocketImpl; 
oldImpl = false; 

e l'oggetto m_DataPack è la seguente:

address = Inet4Address (id = 32) (-1,-1,-1,-1); 
bufLength = 6 (size of packet I'm sending is 6 char long); 
offset = 0; 
port = 8001; 
+0

Ti rendi conto che il tuo Gig'Em aliena alcuni diplomati di uno dei più grandi programmi CS in America, giusto? – jasonmp85

+0

@ jasonmp85 per quei non-texani che si stanno chiedendo cosa significhi: https://en.wikipedia.org/wiki/Traditions_of_Texas_A%26M_University#Gig_.27em (sì, ho dovuto cercarlo;)) – Matthieu

risposta

1

Se si desidera ricevere un datagramma è necessario bind() per l'endpoint locale (indirizzo + port).

+0

In the bind funzione Ho bisogno di impostare l'endpoint locale a un indirizzo e porta attraverso un SocketAddress. Qual è il modo migliore per farlo? So che nella classe DatagramPacket c'è un getSocketAddress(); funzione in modo che non mi aiuti. – user355528

+0

Ho provato m_DataPack = new DatagramPacket (data, data.length, InetAddress.getLocalHost(), m_SERVERPORT); e poi m_Socket.bind (m_DataPack.getSocketAddress()); ma lancia un'eccezione dicendo che il socket è già stato associato. – user355528

+0

È vincolante, è ciò che fa il nuovo DatagramSocket (int port). – EJP

10

Questo non ha senso. Stai trasmettendo, che è 1-a-molti, e ti stai anche connettendo, che è 1-a-1. Cos'è questo?

Perdere la connessione. E perdere 255.255.255.255. Questo è stato pesantemente deprecato per circa 20 anni. Utilizza un indirizzo di broadcast subnet-local, ad es. 192.168.1.255.