将程序包移植到NodeJS并遇到Buffer.alloc()

时间:2019-02-06 15:58:20

标签: node.js buffer

我正在将游戏服务器移植到NodeJS。问题是我对数据包和如何构建它们一点都不熟悉。阅读完NodeJS文档后,我认为我已经按照客户端期望的方式构造了响应,但我认为客户端似乎对服务器发送的响应不佳。

希望有人可以确认这是我的服务器响应中与文档要求不符的内容。

客户端希望从TCP套接字获得以下响应:

Packet Build
BYTE[1] cmd (0xA8)
BYTE[2] total length of this packet
BYTE[1] System Info Flag (0x5D)
BYTE[2] # of servers

(Repeat as needed for each server)
BYTE[2] server index (0-based)
BYTE[32] server name
BYTE percent full
BYTE timezone
BYTE[4] server IP to ping

这是我对文档的NodeJS解释。

    /** Build response header */
    const length = 45
    serverResponse = Buffer.alloc(length)
    serverResponse.fill(0xA8, 0)
    serverResponse.fill(Buffer.alloc(2, length), 1)
    // Last fill had a buffer size of 2, so our next offset considers that
    serverResponse.fill(0x5d,3)
    serverResponse.fill(Buffer.alloc(2, 1),4)

    /** Build response server list */
    serverResponse.fill(Buffer.alloc(2, 0),5) /* 2 Bytes (server index, 0-based) */
    // Last fill had a buffer size of 2, so our next offset considers that
    serverResponse.fill(
      Buffer.alloc(32, Buffer.from('Heres your server')),
      7)  /* 32 bytes (Server name) */
    serverResponse.fill(Buffer.alloc(1, 9), 39)  /* 1 Bytes (% Full) */

    /** 
     * Trying -12 - 12 range divided by (60 * 60)).  @see
     * https://github.com/Sphereserver/Source/blob/0be2bc1d2e16659239460495b9819eb8dcfd39ed/src/graysvr/CServRef.cpp#L42
     */
    serverResponse.fill(Buffer.alloc(1, -5 / (60 *60)),40) /* 1 Bytes (Timezone */  
    serverResponse.fill(Buffer.from([0,0,0,0]), 41) /** IP Address */

这将输出:

<Buffer a8 2d 2d 5d 01 00 00 48 65 72 65 73 20 79 6f 75 72 20 73 65 72 76 65 72 48 65 72 65 73 20 79 6f 75 72 20 73 65 72 76 09 00 00 00 00 00>

编辑:我发现以下内容可能会对我有所帮助。

相当于NodeJS

/**
 * BYTE   8-bit unsigned                          buf.writeUInt8()
 * SBYTE  8-bit signed                            buf.writeInt8()
 * BOOL   8-bit boolean (0x00=False, 0xFF=True)   buf.fill(0x00) || buf.fill(0xFF)
 * CHAR   8-bit single ASCII character            buf.from('Text', 'ascii') - Make 8-bit?
 * UNI    16-bit single unicode character         buf.from('A', 'utf16le') - Correct?
 * SHORT  16-bit signed                           buf.writeInt16BE() - @see https://www.reddit.com/r/node/comments/9hob2u/buffer_endianness_little_endian_or_big_endian_how/
 * USHORT 16-bit unsigned                         buf.writeUInt16BE() - @see https://www.reddit.com/r/node/comments/9hob2u/buffer_endianness_little_endian_or_big_endian_how/
 * INT    32-bit signed                           buf.writeInt32BE - @see https://www.reddit.com/r/node/comments/9hob2u/buffer_endianness_little_endian_or_big_endian_how/
 * UINT   32-bit unsigned                         buf.writeUInt32BE - @see https://www.reddit.com/r/node/comments/9hob2u/buffer_endianness_little_endian_or_big_endian_how/
 */

0 个答案:

没有答案