Исправлен порт для отправки сообщений с помощью dgram - PullRequest
0 голосов
/ 16 июня 2019

Я использую узел 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();
    });
  });
});

1 Ответ

0 голосов
/ 16 июня 2019

Есть ли способ заставить dgram отправлять с заранее определенного порта каждый раз?

Просто привяжите сокет UDP к порту (и IP), который вы хотите использовать в качествеисходный порт.Когда вы затем вызовете send или sendto на этом сокете, он будет использовать адрес (порт IP +), к которому вы привязаны, в качестве адреса источника.Затем вы можете вызвать recv или recvfrom в том же сокете, чтобы получить ответ.

РЕДАКТИРОВАТЬ - после просмотра действительного кода:
проблема в том, что вы создали еще один сокет UDP для отправки,Вместо этого вы должны использовать сокет, который уже привязан к адресу и порту не только для приема, но и для отправки.

...