首页 > 解决方案 > 如何在 node.js socket.send 回调中发送更多 UDP 数据报?

问题描述

如果我在自己的回调中调用 socket.send,一些 UDP 数据报永远不会出现在目的地。使用 Linux API send(3) 当没有缓冲区或有其他本地错误时,我会收到一个错误。我一直无法在节点中找到模拟。这是带有工作和失败代码路径的示例(选择大的 const 布尔值)。

const dgram = require('dgram');

const WOULD_YOU_LIKE_ME_TO_DROP_BUFFERS = true; // TOGGLE THIS

const PORT = 41234;
const GRAMS = 1000;
const FILL = '##################################################'

function sendgrams() {
    let pos = 0;
    const socket = dgram.createSocket('udp4');
    function funkytown() {
        if (pos >= GRAMS) {
            socket.close((e) => {
                if (e) {
                    console.log(e);
                }
                console.log('Closed.');
            });
            return;
        }
        socket.send(`${pos++} ${FILL}${FILL}${FILL}${FILL}${FILL}${FILL}${FILL}`, PORT, (e) => {
            if (e) {
                console.log(e);
            }
            if (WOULD_YOU_LIKE_ME_TO_DROP_BUFFERS) {
                funkytown();
            } else {
                setTimeout(funkytown, 0);
            }
        });
    }
    funkytown();
}

sendgrams();

这是一个快速而肮脏的监视器,但可以随意使用其他东西:

require ('dgram')
.createSocket('udp4')
.on('message', (msg, rinfo) => {
    msg = `${msg}`.split(' ')[0];
    console.log(`server got: ${msg} from ${rinfo.address}:${rinfo.port}`);
})
.bind(41234);

标签: node.js

解决方案


推荐阅读