Estoy desarrollando un programa node.js que se conecta a través de UDP con otro programa que se ejecuta en la misma máquina. Actualmente estoy enviando datos como este:
import dgram = require("dgram"); const client = dgram.createSocket("udp4"); //Some code to structure the message how the server wants it const message = Buffer.alloc(413); message.write("TEST\0"); client.send(message, 0, message.length, 49000, '127.0.0.1', (err) => { if (err) { this.client.close(); console.error(err); } });Esto funciona bien, sin embargo, quiero hacer el código en dos pasos. Primero abra la conexión y luego envíe el mensaje. Este es el código que escribí (saltándome algunas cosas repetidas):
//const message same as above this.client.bind(49000, '127.0.0.1', (err) => { if (err) { this.client.close(); console.error(err); } else { this.client.send(message, 0, message.length, (err) => { if (err) { this.client.close(); console.error(err); } }); } }); Esto arroja el error: throw new ERR_SOCKET_BAD_PORT(name, port, allowZero); RangeError [ERR_SOCKET_BAD_PORT]: Port should be > 0 and < 65536. Received 0.
Editar:
Gracias leitning! .connect() es exactamente lo que necesitaba. Ahora tengo otro problema. Cuando hago .send() directamente sin llamar a .connect() antes de poder recibir datagramas entrantes creando un .on('message') en el cliente. Pero cuando me conecto y luego envío, el oyente no recibe ningún mensaje entrante. Probé esto con Wireshark y hay mensajes entrantes.
El código es:
import dgram = require("dgram"); const client = dgram.createSocket("udp4"); const message = Buffer.alloc(413); message.write("TEST\0"); client.connect(49000,'127.0.0.1',err => { if (err) console.error(err); client.send(message, 0, message.length, 49000, '127.0.0.1', (err) => { if (err) { this.client.close(); console.error(err); } }); }); client.on('message',(data) => { console.log(data); }); ¿Hay algo que me perdí de los documentos sobre cómo recibir mensajes después de hacer .connect() ?
Cuando vincula un puerto, está reclamando ese puerto del sistema operativo con el fin de enviar y recibir. No tiene nada que ver con el lugar al que se enviarán los mensajes.
Al vincular a localhost: 49000, los paquetes que envíe declararán que provienen del puerto localhost 49000. También puede escuchar el socket vinculado para los mensajes entrantes al puerto localhost 49000.
Aún debe declarar un destinatario para los mensajes que está tratando de enviar. Obtiene un error de puerto no válido porque la función está interpretando su argumento 0 como el puerto de destino. dgram.send docs
Parece que la funcionalidad que está tratando de usar está cubierta en el método dgram.connect .