我试图弄清楚如何在一个reading调用中获取所有可用的数据报(这可能会转换为一个系统调用),类似于在c++中调用rcvmmsg。
现在我的代码是这样的:
private final Selector_;
private final ByteBuffer buffer_ = ByteBuffer.allocate(2048);
public UDPClient() {
try {
selector_ = Selector.open();
} catch (IOException ex) {
throw new RuntimeException(ex);
}
}
public void joinGroup(String group_ip, int group_port, String iface_name) throws IOException {
final NetworkInterface iface = NetworkInterface.getByName(iface_name);
final DatagramChannel channel = DatagramChannel.open(StandardProtocolFamily.INET)
.setOption(StandardSocketOptions.SO_REUSEADDR, true)
.bind(new InetSocketAddress(group_port))
.setOption(StandardSocketOptions.IP_MULTICAST_IF, iface);
channel.configureBlocking(false);
channel.join(InetAddress.getByName(group_ip), iface);
channel.register(selector_, SelectionKey.OP_READ);
}
public void recvDatagrams() throws IOException {
if (selector_.selectNow() > 0) {
for (SelectionKey key: selector_.selectedKeys()) {
final DatagramChannel channel = (DatagramChannel)key.channel();
channel.receive(buffer_);
buffer_.flip();
// Handle buffer ...
buffer_.clear();
}
selector_.selectedKeys().clear();
}
}
我想要的接收代码如下:
ByteBuffer[] buffers_ = new ByteBuffer[64];
// [...]
channel.read(buffers_);
// Handle datagrams
这将允许我在一个调用中接收多达64个数据报,如果它们已经在我的网络接口上排队的话。我面临的问题是read()if表示“已连接”频道。我的频道没有连接,我不知道来源,我只是加入一个多播组并从中接收数据报。
请注意,我知道我可以 while
回路上的 channel.receive()
调用以填充 buffers_
阵列我自己,但这不是我的立场。
干杯!
暂无答案!
目前还没有任何答案,快来回答吧!