使用node.js

时间:2016-04-20 14:47:53

标签: node.js windows networking tcp wireshark

我在工作中遇到这个超级奇怪的问题;我制作了两个小的node.js程序,它们通过HTTP get和post请求相互交互。程序B监视一些文本文件,并在文件发生变化时(每分钟一次)向程序A发送一个发布请求。在确认该请求之后,程序A然后向程序B发送一个发布请求,然后程序B写入另一组文本文件。

托管程序B的计算机,在当天的某个(不可预测的)点,只是停止获得正确的网络连接 - 我们将无法使用浏览器,无法远程桌面,并且节点程序也无法通过ECONNRESET错误进行通信,记录。但是,它可以ping网络和Internet上的其他计算机。我们认为网卡有问题所以我们实际上切换了运行程序B的机器,我们仍然遇到同样的问题。

我们注意到这只会在Node.js运行时发生,并且正在主动向程序A发送https请求。重新启动是我们发现的唯一可以使事情恢复正常的解决方案。

我们的下一个想法是安装Wireshark,看看有什么问题。我们注意到的第一件事是在'info'字段:

3000→53550 [RST,ACK] Seq = 2 Ack = 1 Win = 0 Len = 0

它每分钟发生一次,似乎来自托管程序A的机器。这是正常行为吗? (Wireshark以红色突出显示)此时网络通信仍然正常。

最终,它出现了一个TCP窗口,然后事情变得更糟: Zero TCP Window

我们开始看到重复的确认和大量的重新传输: Retransmissions

然后最后TCP窗口已满,然后重置: enter image description here

此时网络通信失败(除了能够ping)。

我完全迷失了。我不知道这是我的编程问题,还是网络工具的节点实现问题,或者它是驱动程序/硬件问题还是内核问题。

我们在两台机器上运行Windows 7。节点4.4.1

对此可能提出的任何帮助或建议都会非常感激。

修改

以下是有关在程序B (我正在使用Express.js)中发送和接收信息的一些代码段。

接收:

app.post('/eton_call', function (req, res){
    logger.info("POST REQUEST: eton_call") //using winston.js to log things
    reqCalls_writer.write_file(req.body); //writes the text file in a certain format
    res.sendStatus(201);
})

app.post('/USERPRUN_call', function (req, res){
    logger.info("POST REQUEST: userprun_call")
    userPrun_writer.write_file(req.body);
    res.sendStatus(201);
})

发送:(他们都使用这个原型函数。参数,快照,是一些JSON)

Eton_file_sync.prototype.send_snapshot = function(snapshot) {
    logger.info('sending snapshot');

    var post_options = {
        host: config.fex_server.host,
        port: config.fex_server.port,
        path: this.post_uri,
        method: 'POST',
        headers: {
            'Content-Type': 'application/json',
            'Content-Length': snapshot.length
        }
    };

    var post_req = http.request(post_options, function(res) {
        logger.info("STATUS: " + res.statusCode);
        res.setEncoding('utf8');
        res.on('data', function (chunk) {
            logger.info('Response: ' + chunk);
        });
    });

    post_req.on('error', function(e){
        logger.error('Snapshot not sent. Please ensure connectivity to fex-server.js. This snapshot will be lost. Error Message: ' + e.message);
    })

    post_req.write(snapshot);
    post_req.end();
}

这是编写文件的代码

Eton_asc_writer.prototype.write_file = function (data_arr){

    logger.info("writing file");
    var buffer_data = '';
    data_arr.forEach(function (data_element, index, array){
        for (prop in data_element){
            _.find(this, function(template_element){//finds the template_element with the correct descriptions
                return template_element.description == prop; //^
            }).datum = data_element[prop];//copies over datum to template element
        }
        //finds the first then second then third.. nth field.
        for (var field_order = 1; field_order < this.length; field_order++){
            var current_field = _.find(this, function(template_element){
                return template_element.field_order == field_order;
            });
            if (!current_field.datum && (current_field.datum != 0)){
                current_field.datum = "";
            }
            var required_padding_amount = current_field.required_length - current_field.datum.toString().length;
            assert(required_padding_amount >= 0, "invalid length on " + current_field.description);
            //assert(current_field.type == typeof current_field.datum, "datum types don't match");
            for (var padding = ''; padding.length < required_padding_amount;)
                padding += ' ';
            if (current_field.type == "string"){
                current_field.padded_datum = current_field.datum + padding + ';';
            }
            else {
                current_field.padded_datum = padding + current_field.datum + ';';
            }
            buffer_data += current_field.padded_datum;
        }
        buffer_data += '\r\n';//buffer newline
    }, this.template_in_use);

    //console.log(buffer_data);

    write_buffer = new Buffer(buffer_data, 'utf8');
    var file = fs.createWriteStream(this.filename);
    file.write(write_buffer);
    file.end();

}

对于程序A ,当时发生的唯一发布请求来自:(req_calls是一组共享相同键/值对的对象)

function exportReqCalls(req_calls){
    if (req_calls.length == 0){
        return;
    }

    exported_req_calls = JSON.stringify(req_calls);

    var post_options = {
        host: config.eton_agent.host,
        port: config.eton_agent.port,
        path: '/eton_call',
        method: 'POST',
        headers: {
            'Content-Type': 'application/json',
            'Content-Length': exported_req_calls.length
        }
    };

    var post_req = http.request(post_options, function(res) {
        logger.info("STATUS: " + res.statusCode);
        res.setEncoding('utf8');
        res.on('data', function (chunk) {
            //console.log('Response: ' + chunk);
        });
    });

    post_req.on('error', function(e){
        logger.error('ReqCall not sent. Please ensure connectivity to eton-agent.js. Error Message: ' + e.message);
    });

    post_req.write(exported_req_calls);
    post_req.end();   
}

0 个答案:

没有答案