【问题标题】:Fixed port for sending messages with dgram使用 dgram 发送消息的固定端口
【发布时间】:2019-06-16 16:30:03
【问题描述】:

我正在使用节点 dgram 将 OSC 消息发送到设备。 设备将其响应发送到请求来自的端口(我无法更改)。

现在我的问题是我不知道 dgram 将使用哪个端口来发送消息,所以我无法绑定 UDP 套接字以侦听响应的正确端口。

有什么方法可以强制 dgram 每次都从预先确定的端口发送?

编辑:添加代码

var serverPorts = {
  ClientSide: 1488,
  ControllerSide: 1499
};

// UDP server, listens to controllers.
var dgram = require("dgram");
var UDPserver = dgram.createSocket("udp4");
const OSC = require("osc-js");
// socket.io, listening to K2
var SocketServer = require("socket.io").listen(serverPorts.ClientSide);

// Got messages on the server
UDPserver.on("message", function(msg, rinfo) {
  console.log(
    "server got: " + msg + " from " + rinfo.address + ":" + rinfo.port
  );
  // Send them to the K2 clients
  console.log("emitting on osc: " + msg);
  SocketServer.sockets.emit("osc", { osc: msg });
});

UDPserver.on("listening", function() {
  var address = UDPserver.address();
  console.log(
    "UDP server listening on " + address.address + ":" + address.port
  );
});

UDPserver.bind(serverPorts.ControllerSide);

SocketServer.sockets.on("connection", function(socket) {
  // Tell who we are and our version
  socket.emit("admin", { id: "K2OSCSERVER", version: 0.1 });
  console.log("Emitted ID and version on the admin channel");

  // K2 sent us OSC data
  socket.on("osc", function(data) {
    console.log("Received data on the 'osc' channel: " + data);
    // Send data on each one of the UDP hosts
    var message =
      typeof data.value != "undefined" && data.value != null
        ? new OSC.Message(data.path, data.value)
        : new OSC.Message(data.path);
    var binary = message.pack();
    var buffer = new Buffer.from(binary, "binary");
    var client = dgram.createSocket("udp4");
    client.send(buffer, 0, buffer.length, 10024, "192.168.0.171", function(
      err,
      bytes
    ) {
      console.log("err: ", err, "bytes: ", JSON.stringify(bytes));
      //client.close();
    });
  });
});

【问题讨论】:

标签: node.js udp osc dgrams


【解决方案1】:

有什么方法可以强制 dgram 每次都从预先确定的端口发送?

只需将 UDP 套接字绑定到您要用作源端口的端口(和 IP)。然后,当您在此套接字上调用 sendsendto 时,它将使用您绑定的地址(IP+端口)作为源地址。然后您可以在同一个套接字上调用recvrecvfrom 以获取响应。

编辑 - 看到实际代码后:
问题是您创建了另一个用于发送的 UDP 套接字。相反,您应该使用已经绑定在地址和端口上的套接字,不仅用于接收,还用于发送。

【讨论】:

  • 我确实尝试绑定端口,但它似乎只影响接收端口。
  • @cracanut:那你做错了什么。只是,由于您既没有提供代码,也没有提供您的测试方式以及您得到的确切结果,所以不可能找出您到底做错了什么。
  • 我已经编辑了我的原始问题以包含我正在使用的代码。如您所见,我已经在进行绑定,但它只影响“监听”端口。我猜我可能不得不使用 dgram 替代品?
  • @cracanut:UDP 不像 TCP 那样有监听套接字和连接套接字的概念,因为在 UDP 中没有建立连接之类的东西——只有发送数据报。这意味着您应该使用“侦听”套接字来发送数据,在这种情况下,它们将使用正确的源地址和端口发送。
  • 谢谢,我完全忽略了底部第二个 UDP 套接字的创建。我将发送更改为也使用 UDPServer,现在它按预期工作。我猜这就是复制粘贴互联网所得到的:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-31
  • 1970-01-01
  • 2014-03-01
  • 2013-03-14
  • 1970-01-01
相关资源
最近更新 更多