在C中是否有类似java ByteBuffer函数的指针函数

时间:2011-06-01 14:23:26

标签: java c pointers performance bytebuffer

我正在使用ByteBuffer与java nio一起传输数据。可以将相同的消息发送到多个接收器。消息格式是“消息标题+消息内容”。一种明星的方法是为每个接收器分配一个新的字节缓冲区。这不是很有效率。

我的问题是在C / C ++中是否有类似的ByteBuffer java函数到指针函数。所以我可以使用一个缓冲区来保存消息内容并使用不同的标头进行连接。这样,就是效率。

感谢。

2 个答案:

答案 0 :(得分:2)

在Java中,你可以使用GatheringByteChannel(你很可能正在处理它)。它允许为每个拥有不同内容的客户端提供一个包含头部的静态缓冲区和一个单独的缓冲区。对于某些入门材料,您可以查看此博客文章:

http://javaol.wordpress.com/2011/05/06/java-nio-scatter-gather/

答案 1 :(得分:0)

我使用单个ByteBuffer发送给多个接收器。

ByteBuffer bb = ByteBuffer.allocateDirect(LARGE_BUFFER);
bb.clear();
bb.position(START_OF_CONTENT /* 1024 */);
appendContentTo(bb);
int endOfContent = bb.position();

bb.limit(endOfContent);
for(Connection conn: connections) {
    bb.position(START_OF_CONTENT);
    /* prepend header BEFORE the position and move the position back */
    conn.prependHeader(bb); 
    conn.write(bb);
}

这样,您可以为每个连接使用相同的ByteBuffer。只有一份内容副本。

conn.prependHeader()的示例

public void prependHeader(ByteBuffer bb) {
    // bb starts at the start of the content.
    int pos = bb.position();
    // it would be better if a byte[] wasn't required. This is just an example
    byte[] header = getHeaderAsBytes();
    bb.position(bb.position()-header.length);
    bb.put(header);
    // bb starts at the start of the header.
    bb.position(bb.position()-header.length);
}