节点UDP dgram在递归函数中发送太多数据包
Node UDP dgram sending too many packets in recursive function
我目前正在处理的代码有一个棘手的问题。基本上,这段代码的目的是发送一个 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 模块本身有关,但我无法弄清楚到底是什么。
就是这样!任何帮助将不胜感激,如有任何关于代码及其功能的问题,请随时问我。干杯!
问题是您每次发送消息 (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);
}
}
我目前正在处理的代码有一个棘手的问题。基本上,这段代码的目的是发送一个 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 模块本身有关,但我无法弄清楚到底是什么。
就是这样!任何帮助将不胜感激,如有任何关于代码及其功能的问题,请随时问我。干杯!
问题是您每次发送消息 (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);
}
}