使用Node.js net.socket和流式消息协议

时间:2015-05-21 14:50:45

标签: javascript c++ node.js sockets

我有一个C ++服务器进程我试图通过TCP连接使用简单的流协议。数据包的前8个字节是以位为单位的消息长度,然后数据包的其余部分是作为字符串的实际消息。连接到所述服务器的C ++客户端进程为此构造消息,如下所示:

char* msgBuff = new char[msgLen + sizeof(int)];
int nlen = htonl(msgLen);
memcpy(msgBuff, &nlen, sizeof(int));
memcpy(msgBuff + sizeof(int), msg, msgLen);

所以我试图在node.js中做同样的事情。我有我的消息字符串,我通过将msglen var转换为表示正确的字节交换十六进制值的字符串来编写我自己的htonl版本。然后我用该字符串执行parseInt以将var作为十六进制值:

var byteSwappedMsgLen = parseInt(lengthAsAString,16);

然后我尝试将此和我的msg写入我的net.socket,如下所示:

soc.write(byteSwappedMsgLen + msg);

但是出了点问题。我的msg长度为210(十六进制为000000d2),我的函数使用byteswapped,使得lengthAsAString = d2000000。但出于某种原因,当我将byteSwappedMsgLen打印到控制台时,它等于3523215360.C ++服务器将其读取为消息长度为859124275.所以我不确定我是否没有转换字符串正确和\或如果我没有正确构建消息。

1 个答案:

答案 0 :(得分:0)

想通了我需要使用缓冲区并用前导零填充十六进制值(不需要字节交换)。

namespace BrightMediaTest
{
using System;
using System.Collections.Generic;

public partial class merchant
{
    public merchant()
    {
        this.stores = new HashSet<store>();
    }

    public long merchantID { get; set; }
    public string merchantName { get; set; }

    public virtual ICollection<store> stores { get; set; }
}