我用c ++编写了一个服务器,代码看起来像这样

char *sendBuffer = new char[4+4+1+8+48];
m_magicNumberBuffer[0] = 0xA9;
m_magicNumberBuffer[1] = 0xA9;
m_magicNumberBuffer[3] = 0xA9;
m_magicNumberBuffer[4] = 0xA9;
int m_dataLength = 4+4+1+8+48;
unsigned char m_type = 1;
long long m_deviceId = 12123122123;
char m_msg = new char[48];
m_msg = "NO ERROR";

/*
 * Magic number;
 */
memcpy(sendBuffer, m_magicNumberBuffer + offset, 4);
offset += 4;

/*
 * Data length
 */
memcpy(sendBuffer, &m_dataLength + offset, 4);
offset += 4;

/*
 * Packet type
 */
memcpy(sendBuffer, &m_type + offset, 1);
offset += 1;

/*
 * Device ID
 */

memcpy(sendBuffer, &m_deviceId + offset, 8);
offset += 8;

memcpy(sendBuffer, m_msg + offset, 48);
offset += 48;


我正在写sendBuffer

 write(client->getFd(), sendBuffer, MAX_LENGTH);


客户端是用Java编写的

我正在做这样的事情

        InputStream in = mSocket.getInputStream();
        DataInputStream dis = new DataInputStream(in);

        int magicNumber = dis.readInt();
        int length = dis.readInt();
        byte[] data = new byte[length];
        if(length > 0){
            dis.readFully(data);
        }


而且它读错了。我得到的魔术数字是不合理的数字,并且总是读取0作为数据长度。

我该如何解决 ?提前致谢..

最佳答案

确实很简单:您要将offset添加到目标sendBuffer,而不是源。例如。代替

memcpy(sendBuffer, &m_deviceId + offset, 8);


你要

memcpy(sendBuffer + offset, &m_deviceId, 8);


照原样,您正在将各种随机数据存储到sendBuffer的前几个字节,而其余部分则什么也没有。

10-06 07:28
查看更多