Path: csiph.com!x330-a1.tempe.blueboxinc.net!usenet.pasdenom.info!news.albasani.net!fu-berlin.de!uni-berlin.de!individual.net!not-for-mail From: Robert Klemme Newsgroups: comp.lang.java.programmer Subject: Re: Retrieving Sender Information From A Non-blocking DatagramChannel Date: Mon, 24 Oct 2011 22:41:28 +0200 Lines: 92 Message-ID: <9gm0s4FjsaU1@mid.individual.net> References: Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Trace: individual.net evG8iRY2GaE+MnFFaWMSzQjHKwtDj9v4eoxMOwtwITgPzfQt8= Cancel-Lock: sha1:0e2v26ecYU/nkeziAyvfsRZZ2vM= User-Agent: Mozilla/5.0 (Windows NT 6.0; WOW64; rv:7.0.1) Gecko/20110929 Thunderbird/7.0.1 In-Reply-To: Xref: x330-a1.tempe.blueboxinc.net comp.lang.java.programmer:9152 On 24.10.2011 21:14, Bala wrote: > I have a DatagramChannel that I have added to a Java Selector. Hence > the configureblocking is set to false since the selector expects a non > blockign socket. > I have to use the DatagramChannel's receive call and cannot use the > socket.receive which reads the data in a packet due to the nonblocking > mode. > > If I would have received / sent DatagramPacket using the > dc.socket().receive call, then the packet provides you the Sender > information anyways. > > The problem is that I need the host/port of the sender from this > DatagramChannel. I see there are a couple of private variables within > the DatagramChannel class cachedSenderInetAddress, cachedSenderPort) > that have this information but those are private variables and I do > not see any method in the DatagramChannel or its socket to retrieve > the sender information. > > Is there a way I can do this? > > Here is the code snippet for the Receiver > ========================================= > > class CReadDatagramChannel { > > DatagramChannel dc = DatagramChannel.open().configureBlocking(false); > > public CReadDatagramChannel (int port, Selector selector) { > dc.socket().setReuseAddress(true); > dc.socket().bind(new InetSocketAddress(port)); > dc.register(selector, SelectionKey.OP_READ, this); > } > > /* This method gets invoked from the Selector on the isReadable() */ > public void processRead () { > // I cannot do dc.socket().receive(packet) since the blocking is > false. > ByteBuffer socketBuffer = ByteBuffer.allocate(1024); > dc.receive (socketBuffer); You're almost there: "Returns: The datagram's source address, or null if this channel is in non-blocking mode and no datagram was immediately available" http://download.oracle.com/javase/6/docs/api/java/nio/channels/DatagramChannel.html#receive(java.nio.ByteBuffer) In other words: you just need to change the line into final SocketAddress sender = dc.receive(socketBuffer); and be done. > } > } > > > Here is the code snippet for the Sender > ======================================= > > class CWriteDatagramChannel { > DatagramChannel dc = DatagramChannel.open().configureBlocking(false); > > public CWriteDatagramChannel (int port, Selector selector) { > dc.socket().setReuseAddress(true); > dc.socket().bind(new InetSocketAddress(port)); > dc.register(selector, SelectionKey.OP_READ, this); > } > > /* This method gets invoked from the Selector on the isWritable() */ > pubic void processWrite (ByteBuffer writeBuffer, String host, int > port) { > // I cannot do dc.socket().write since the blocking is false. > dc.send(writeBuffer, new InetSocketAddress (host, port)); > } > } > > > Is there a way to know the Sender after the receive call in the > Reader? See above. Kind regards robert -- remember.guy do |as, often| as.you_can - without end http://blog.rubybestpractices.com/