【问题标题】:Node UDP dgram sending too many packets in recursive function节点UDP dgram在递归函数中发送太多数据包
【发布时间】:2016-09-17 15:46:28
【问题描述】:

我目前正在处理的代码有一个棘手的问题。基本上,这段代码的目的是发送一个 UDP 广播,监听一个响应(这不是它刚刚发送的广播),然后通过 socket.io 连接。递归是为了确保以 1 秒的间隔持续发送数据包,直到给出响应。这是代码的主要内容:

function requestBroadcast(message, broadcastPort) {
    var client = dgram.createSocket('udp4');
    client.bind(config.listenPort, function() {
        client.setBroadcast(true);
    })
    var receivedResponse = false;

    function checkResponse () {
        if (receivedResponse) {
            client.close();
            return;
        } else {
            console.error("!");
            client.send(message, 0, message.length, config.listenPort, config.broadcastAdd);
            client.on('message', function(msg, rinfo) {
                var msgObj = JSON.parse(msg);
                console.error(msgObj);
                if (!(msgObj.hasOwnProperty("KartNo"))) {
                    receivedResponse = true;
                    var socket = ioclient.connect("http://" + msgObj.address.toString() + ":" + msgObj.port.toString())
                }
            })
            setTimeout(checkResponse, 1000);
        }
    }
    checkResponse();
}

var msgObj = {KartNo: 38};
var msgObjStr = JSON.stringify(msgObj);
requestBroadcast(msgObjStr, 6000);

不幸的是,问题是这样的:递归函数的每次迭代,都会发送一个额外的数据包。例如,这是终端显示的内容。注意“!”每次调用后 - 每次迭代只调用一次递归函数,所以这不是问题。

!
{ KartNo: 38 }
!
{ KartNo: 38 }
{ KartNo: 38 }
!
{ KartNo: 38 }
{ KartNo: 38 }
{ KartNo: 38 }
!
{ KartNo: 38 }
{ KartNo: 38 }
{ KartNo: 38 }
{ KartNo: 38 }

我唯一的结论是,这一定与 dgram 模块本身有关,但我终生无法弄清楚是什么。

就是这样!任何帮助将不胜感激,请随时向我询问有关代码及其功能的任何问题。干杯!

【问题讨论】:

    标签: javascript node.js recursion udp


    【解决方案1】:

    问题是您每次发送消息 (client.on('message', ...)) 时都会添加一个新的 message 事件侦听器。相反,只需在调用.bind() 后添加一次message 事件侦听器:

    var client = dgram.createSocket('udp4');
    client.bind(config.listenPort, function() {
        client.setBroadcast(true);
    })
    client.on('message', function(msg, rinfo) {
      var msgObj = JSON.parse(msg);
      console.error(msgObj);
      if (!(msgObj.hasOwnProperty("KartNo"))) {
        receivedResponse = true;
        var socket = ioclient.connect("http://" + msgObj.address.toString() + ":" + msgObj.port.toString())
      }
    })
    var receivedResponse = false;
    
    function checkResponse () {
        if (receivedResponse) {
            client.close();
            return;
        } else {
            console.error("!");
            client.send(message, 0, message.length, config.listenPort, config.broadcastAdd);
            setTimeout(checkResponse, 1000);
        }
    }
    

    【讨论】:

    • 啊!呸!天哪,这太有道理了。这让我很困惑,因为我的服务器似乎在发送多个响应……实际上,我只是在听它们多次。谢谢!
    猜你喜欢
    • 2019-05-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-07
    • 2011-02-07
    • 2013-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多