java datagramchannel-在一个“reading”调用中读取所有可用的数据报

sdnqo3pr  于 2021-07-06  发布在  Java
关注(0)|答案(0)|浏览(224)

我试图弄清楚如何在一个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_ 阵列我自己,但这不是我的立场。
干杯!

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题