Actualmente estoy desarrollando un pinger UDP, donde el cliente debe enviar un mensaje (Ping) y recibir pong 10 veces. Sin embargo, los mensajes se envían 10 veces al mismo tiempo, donde la idea es que el servidor envíe pong de vuelta después de recibir ping, sin que la terminal envíe todo a la vez.
Esto se debe al bucle for alrededor del server.send, del cual estoy al tanto. Simplemente no estoy seguro de cómo puedo hacer que el servidor solo envíe una respuesta después de recibir un mensaje, haciendo que el servidor registre un tiempo diferente para cada mensaje. Espero que mi problema tenga sentido. Hasta ahora se me ha ocurrido esto:
var host = "127.0.0.1", port = 33333; var dgram = require( "dgram" ); var buffer = require('buffer'); var server = dgram.createSocket( "udp4" ); var date1 = new Date() var today = Buffer.from(date1) server.on('listening', () => { const address = server.address(); console.log(`server listening on port ` + 4000 + ' and address 127.0.0.1'); }); server.on( "message", function( msg, rinfo ) { for (let message = 0; message < 10; message++){ const message = 'Ping' server.send( message, 0, msg.length, rinfo.port, rinfo.address, date1 ); console.log( rinfo.address + ':' + rinfo.port + ' - ' + msg + ' . ' + date1 ); }}); server.on('error', (err) => { console.log(`server error:\n${err.stack}`); server.close(); }); server.on("close", function(){ console.log("\n Client is offline") }) server.bind( port, host );Lado del cliente:
var host = "127.0.0.1", port = 33334; var dgram = require( "dgram" ); var buffer = require('buffer'); var client = dgram.createSocket( "udp4" ); var date1 = new Date() var today = Buffer.from(date1) console.log(date1) client.on('listening', () => { const address = client.address(); console.log(`client listening on port ` + 4000 + ' and address 127.0.0.1'); }); client.on( "message", function( msg, rinfo ) { console.log( rinfo.address + ':' + rinfo.port + ' - ' + msg + ' - ' + date1 ); }); client.on('error', (err) => { console.log(`server error:\n${err.stack}`); server.close(); }); client.on("close", function(){ console.log("\n Client is offline") }) client.bind( port, host ); //client listens to a port var message = "Pong!" client.send(message, 0, message.length, 33333, "127.0.0.1", date1 );Hasta ahora, el código también imprime la hora en que se envía cada mensaje (obtengo la misma hora para todos los mensajes enviados). Cualquier idea sobre cómo podría incorporar el tiempo de ida y vuelta después de que se hayan enviado los 10 pings y pongs sería increíble.
¡Muchas gracias de antemano!
Solo necesita contar la cantidad de veces que se recibe un ping y verificar si es igual a diez:
var numPingPongs = 0; server.on( "message", function( msg, rinfo ) { if (numPingPongs < 10) { const message = 'Ping' server.send( message, 0, msg.length, rinfo.port, rinfo.address, date1 ); console.log( rinfo.address + ':' + rinfo.port + ' - ' + msg + ' . ' + date1 ); numPingPongs++; } else { // Reached ten ping pongs, do whatever here. } });Asumí que querrías calcular la latencia o lo que sea en el lado del servidor, así que escribí esto para el servidor. Pero también puede aplicar la lógica al cliente.