使用 ngrok 使用 tcp 隧道将数据发送到 tcp 端口时出错

Posted

技术标签:

【中文标题】使用 ngrok 使用 tcp 隧道将数据发送到 tcp 端口时出错【英文标题】:error while sending data to tcp port using tcp tunneling using ngrok 【发布时间】:2022-01-21 04:22:10 【问题描述】:

我想将 TCP 数据发送到全局公开的端口。我写了一个服务器代码:

server.js

const net = require('net');
const port = 8080;
const host = '127.0.0.1';
var fs = require("fs");

const server = net.createServer();
server.listen(port, host, () => 
    console.log('TCP Server is running on port ' + port + '.');
);

let sockets = [];

fs.writeFile('tcpdata.log', 'id,pm25,pm10,temp,hum,atm,loc,m1,m2,m3,m4,m5,m6,m7,m8,m9,m10.m11,m12,m13,m14,m15,m16\n', function (err) 
  if (err) throw err;
  console.log('Created successfully.');
);

server.on('connection', function(sock) 
    console.log('CONNECTED: ' + sock.remoteAddress + ':' + sock.remotePort);

    sockets.push(sock);

    sock.on('data', function(data) 
        console.log('DATA ' + sock.remoteAddress + ': ' + data);
        fs.appendFile('tcpdata.log', data, function(error)console.log('data written'););
        // Write the data back to all the connected, the client will receive it as data from the server
        sockets.forEach(function(sock, index, array) 
            sock.write(sock.remoteAddress + ':' + sock.remotePort + " said " + data + '\n');
        );
    );

    // Add a 'close' event handler to this instance of socket
    sock.on('close', function(data) 
        let index = sockets.findIndex(function(o) 
            return o.remoteAddress === sock.remoteAddress && o.remotePort === sock.remotePort;
        )
        if (index !== -1) sockets.splice(index, 1);
        console.log('CLOSED: ' + sock.remoteAddress + ' ' + sock.remotePort);
    );
);

将数据发送到 TCP 端口的步骤。

    启动 server.js

    连接到 tcp 端口 8080

    向tcp端口“2.tcp.ngrok.io:16185”发送数据的AT命令

    AT+CREG=1

    好的

    AT+CREG?

    +CREG: 1

    AT+GPS=1

    好的

    AT+CGATT=1

    +CGATT:1

    好的

    AT+CGDCONT=1,"IP","pinternet.interkom.de"

    好的

    AT+CGACT=1,1

    好的

    AT+CIPSTART="TCP","2.tcp.ngrok.io",16185

    连接正常

    好的

    AT+CIPSEND=101,"'A1',22.00,31.00,7.00,15.00,0.00,$GNGGA,170219.094,4900.5489,N,00825.5612,E,0,3,,311.5,M,47.9,M, ,*51"

    好的

    AT+CIPSTART="TCP","2.tcp.ngrok.io",16185

    已经连接

    好的

    AT+CIPSEND=101,"'A1',23.00,33.00,6.00,14.00,1.00,$GNGGA,170230.000,4900.5372,N,00825.4908,E,0,4,,227.4,M,47.9,M, ,*53"

    好的

    通常发送的数据没有错误,但是在 tcp 端口上出现了一些未知的垃圾数据。并且有一些关闭的端口。我可以修复这个意外关闭和垃圾数据出现在 tcp 端口上吗?我的代码对吗?

    通常的数据接收:

    TCP 端口上的意外错误和关闭

events.js:353
      throw er; // Unhandled 'error' event

data written
CONNECTED: 127.0.0.1:58072
DATA 127.0.0.1: SSH-2.0-Renci.SshNet.SshClient.0.0.1

请您帮忙解决这个问题。如何避免意外的 tcp 连接关闭或避免垃圾数据。

【问题讨论】:

【参考方案1】:
    我觉得你也应该听error事件 您假设on('data') 处理程序在给定事件上只处理一个命令/行?如果是这样,那么情况并非总是如此:您可能会获得部分数据,或者不止一个命令。如果换行符 (\n) 是您的分隔符,那么您应该使用局部变量来缓冲输入,直到获得此分隔符,然后将缓冲的数据视为单行。

【讨论】:

对不起,我对 ngrok 和 node.js 这东西真的很陌生。是的,我假设一次(几秒钟后)有一条关于 on('data') 的短信。

以上是关于使用 ngrok 使用 tcp 隧道将数据发送到 tcp 端口时出错的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# Socket 中使用 ngrok tcp 隧道

如何从 Google Colab Notebook 中杀死 Ngrok 隧道

使用 ngrok 将 SPFX WebPart 隧道传输到 BrowserStack

ngrok FTP隧道问题

如何使用 ngrok 隧道将流量转发到本地托管的 VM 机器的端口?

Ngrok 到 dockerised symfony 5 的隧道以 502 bad gateway 结束