Nodejs中利用net模块,接收纯c编写的socket链接,接收内容问题

Nodejs中利用net模块,接收纯c编写的socket链接,接收内容问题

先贴代码,网上找的。。。。 现在问题是,client端是用纯c编写的socket,发送的数据是放在一个buf里的,我在接收的时候如何转换啊,就是data的内容,感觉现在是默认为字符串了吧。 var net = require(‘net’); var HOST = ‘127.0.0.1’; var PORT = 4545; net.createServer(function(sock) {

// 我们获得一个连接 - 该连接自动关联一个socket对象
console.log('CONNECTED: ' +
    sock.remoteAddress + ':' + sock.remotePort);

// 为这个socket实例添加一个"data"事件处理函数
sock.on('data', function(data) {
    console.log('DATA ' + sock.remoteAddress + ': ' + data);
});

// 为这个socket实例添加一个"close"事件处理函数
sock.on('close', function(data) {
    console.log('CLOSED: ' +
        sock.remoteAddress + ' ' + sock.remotePort);
});

}).listen(PORT, HOST);

console.log('Server listening on ’ + HOST + ‘:’ + PORT);


7 回复

当然可以。让我们来详细探讨一下如何使用Node.js中的net模块来接收来自C语言编写的Socket客户端的数据。

问题背景

你已经有一个基于C语言编写的Socket客户端,它发送的数据存储在一个缓冲区(buffer)中。而你的Node.js服务器使用net模块监听特定的端口和地址,并尝试接收这些数据。问题是,你希望知道如何正确地将接收到的数据从默认的字符串形式转换为原始二进制数据或其他格式,以便更好地处理C语言客户端发送的数据。

示例代码

首先,我们确保使用正确的引号来包含字符串。接下来,我们将展示如何处理接收到的数据,使其适应C语言发送的二进制数据格式。

var net = require('net');
var HOST = '127.0.0.1';
var PORT = 4545;

net.createServer(function(sock) {
    // 当一个新的连接被创建时
    console.log('CONNECTED: ' + sock.remoteAddress + ':' + sock.remotePort);

    // 监听"data"事件,当有数据到达时触发
    sock.on('data', function(data) {
        // 使用Buffer.from将数据转换为Buffer对象
        var bufferData = Buffer.from(data);
        
        // 现在你可以根据C客户端发送的数据格式进行解析
        // 假设C客户端发送的是一个整数
        if (bufferData.length === 4) {
            var receivedInt = bufferData.readInt32LE(0);
            console.log('Received integer: ' + receivedInt);
        } else {
            console.log('Received raw data: ', bufferData);
        }
    });

    // 监听"close"事件,当连接关闭时触发
    sock.on('close', function(data) {
        console.log('CLOSED: ' + sock.remoteAddress + ' ' + sock.remotePort);
    });
}).listen(PORT, HOST);

console.log('Server listening on ' + HOST + ':' + PORT);

解释

  • Buffer: 在Node.js中,Buffer是一个用于处理二进制数据的类。当你从网络接收数据时,默认情况下这些数据是以Buffer的形式存储的,但也可以被当作字符串处理。通过使用Buffer.from(data),我们可以确保接收到的数据被正确地转换成Buffer对象,这有助于处理二进制数据。

  • 读取整数: 如果C客户端发送的数据是一个整数(例如,通过send函数),你可以使用readInt32LE方法从接收到的Buffer中读取这个整数。这里0表示从Buffer的开始位置读取,LE表示以小端序(Little Endian)读取。

以上代码展示了如何处理C语言客户端发送的二进制数据,并将其转换为适合进一步处理的形式。


再顶一次!

看没人回复,给一点参考意见吧 data是一个buffer,好像需要指定编码 data.toString(‘ascii’) 或者socket.setEncoding(),另外你没说你c中的buf是什么…

那个function(data) data 就是一个buffer

发送端那边就发了几个数字,有int的,有float的,原来是用c#的socket,直接用BitConverter.ToInt32之类的,根据不同类型的字节数转的- -,如果发送端和接收端都是node.js运行,我发送的东西都能正常接收,内容正确,是不是这个有默认的编码的啊,lz刚上手啊,小白一个,谢谢指点啊。

看Buffer类吧

要解决这个问题,我们需要明确客户端发送的数据类型。如果客户端发送的是二进制数据(如C语言中的数组或结构体),我们需要将其正确地转换成JavaScript可以理解的形式。

下面是一个简单的例子,展示如何使用Node.js的net模块接收来自纯C编写的Socket客户端的二进制数据。

示例代码

const net = require('net');

const HOST = '127.0.0.1';
const PORT = 4545;

net.createServer((sock) => {
    console.log('CONNECTED: ' + sock.remoteAddress + ':' + sock.remotePort);

    sock.on('data', (data) => {
        // 假设C客户端发送了一个int类型的值
        const buffer = Buffer.from(data);
        const intValue = buffer.readInt32LE(0); // 使用readInt32LE读取32位整数(小端序)
        console.log('Received integer value: ' + intValue);
    });

    sock.on('close', () => {
        console.log('CLOSED: ' + sock.remoteAddress + ' ' + sock.remotePort);
    });
}).listen(PORT, HOST);

console.log('Server listening on ' + HOST + ':' + PORT);

解释

  • BufferBuffer是Node.js用于处理二进制数据的重要工具。在这个例子中,我们使用Buffer.from(data)来创建一个表示二进制数据的Buffer对象。

  • readInt32LE:这个方法用于从Buffer中读取一个32位整数(Little Endian格式)。你可以根据实际需要调整这个方法,例如使用readInt32BE来处理Big Endian格式。

通过这种方式,你可以处理从C客户端发送来的任何二进制数据,并将其转换为你需要的格式。如果你的C客户端发送的是其他类型的数据(如浮点数、自定义结构体等),你需要相应地调整读取方法。

回到顶部