Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.java.programmer > #9152

Re: Retrieving Sender Information From A Non-blocking DatagramChannel

From Robert Klemme <shortcutter@googlemail.com>
Newsgroups comp.lang.java.programmer
Subject Re: Retrieving Sender Information From A Non-blocking DatagramChannel
Date 2011-10-24 22:41 +0200
Message-ID <9gm0s4FjsaU1@mid.individual.net> (permalink)
References <dde9af14-7d8d-45ae-8864-ab5eab3610b9@i19g2000yqa.googlegroups.com>

Show all headers | View raw


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/

Back to comp.lang.java.programmer | Previous | NextPrevious in thread | Next in thread | Find similar


Thread

Retrieving Sender Information From A Non-blocking DatagramChannel Bala <r.balaji.iyer@gmail.com> - 2011-10-24 12:14 -0700
  Re: Retrieving Sender Information From A Non-blocking DatagramChannel Robert Klemme <shortcutter@googlemail.com> - 2011-10-24 22:41 +0200
    Re: Retrieving Sender Information From A Non-blocking DatagramChannel Bala <r.balaji.iyer@gmail.com> - 2011-10-24 14:42 -0700

csiph-web