1

我必须在 C++ 中复制以下 Java 功能才能将数据从 Linux 获取到 Windows。Winsock2 是最好的方法吗?

另外,有什么参考代码可以建议吗?

TIA,乙

导入 java.nio.ByteBuffer;

公共类 MessageXdr {

    私有 ByteBuffer 缓冲区;
    私有 int 大小;

    // taille max corps de message
    私有静态最终 int T_MAX_CORPS_MSG = 16384;

    公共 MessageXdr() {
        缓冲区 = ByteBuffer.allocate(4 * T_MAX_CORPS_MSG);
        大小=0;
    }

    公共 MessageXdr(byte[] 数组)
    {
        ByteBuffer tmpBuffer = ByteBuffer.wrap(array);
        缓冲区 = tmpBuffer.asReadOnlyBuffer();
        大小 = 数组长度;
    }

    公共 int getSize()
    {
        返回大小;
    }

    公共 int getPosition()
    {
        返回缓冲区。位置();
    }

    公共字节[] getArray()
    {
        返回缓冲区.array();
    }

    公共无效resetBuffer()
    {
        大小 = 0;
        缓冲区.rewind();
    }

    公共 int readInt()
    {
        int retour = buffer.getInt();
        回程;
    }

    public long readUnsignedInt()
    {
        ByteBuffer tmp = ByteBuffer.allocate(8);
        tmp.putInt(0);
        tmp.putInt(buffer.getInt());

        返回 tmp.getLong(0);
    }

    公共浮动读取浮动()
    {
        float retour = buffer.getFloat();
        回程;
    }

    公共无效writeInt(int v)
    {
        缓冲区.putInt(v);
        尺寸+=4;
    }

    公共无效writeFloat(浮动v)
    {
        缓冲区.putFloat(v);
        尺寸+=4;
    }
}
4

3 回答 3

1

如果允许您使用 MFC 类 (CSocket),它可能更接近 Java 中的代码。

http://msdn.microsoft.com/en-us/library/wxzt95kb(VS.80).aspx

否则,Winsock2 很好(MFC 类只是在它们的实现中使用它)。

于 2009-06-09T18:41:11.853 回答
1

我还没有使用它,但是当涉及到编组更复杂的数据结构时,我会考虑提升序列化部分。

对于实际的数据传输,winsock2是windows中的基本socket api,所有其他api都建立在它之上(好吧,不知道windows 7)。但同样,研究boost可以为你提供一些你不知道的平台独立的东西' t必须弄清楚两次。但是根据我的经验,套接字是复杂的野兽,所以无论如何你都必须弄清楚......

并避免来自 MFC 的 CSocket,这是有史以来最糟糕的实现。(即使有人说他们修复了其中的一些不当行为,这也不值得。)

于 2009-06-10T17:21:40.047 回答
0

严格字节数组不需要从 linux 到 windows 或其他系统的任何转换。但是,如果您正在处理整数和浮点数...

我个人会使用 Poco::BinaryWriter 和 Poco::BinaryReader http://pocoproject.org/docs/Poco.BinaryWriter.html

using namespace Poco;
using namespace std;
std::ofstream myFile("path", ios::in | ios::binary);
BinaryWriter writer(myFile, BIG_ENDIAN_BYTE_ORDER);
writer << 10.0f; 
writer << 10000; 
//etc etc
myFile.close();

现在阅读

std::ifstream myFile("path", ios::in | ios::binary);
BinaryReader reader(myFile, BIG_ENDIAN_BYTE_ORDER);
int intVariable;
float floatVariable;
reader >> floatVariable;
reader >> intVariable;
//etc etc
myFile.close();
于 2009-06-09T18:40:26.817 回答