From cbf2a2233eb2ef17b7a341b7e88c4309f80457e0 Mon Sep 17 00:00:00 2001 From: Ryan Dahl Date: Wed, 16 Jun 2010 11:00:43 -0700 Subject: [PATCH] Add callback to dgramSocket.send() --- lib/dgram.js | 34 ++++++++++++++++++++++++------ test/simple/test-dgram-pingpong.js | 7 +++++- 2 files changed, 34 insertions(+), 7 deletions(-) diff --git a/lib/dgram.js b/lib/dgram.js index 9a9c3483c2..ed9eec716b 100644 --- a/lib/dgram.js +++ b/lib/dgram.js @@ -146,17 +146,33 @@ Socket.prototype.address = function () { Socket.prototype.send = function(port, addr, buffer, offset, length) { var self = this; + var lastArg = arguments[arguments.length - 1]; + var callback = typeof lastArg === 'function' ? lastArg : null; + if (!isPort(arguments[0])) { - if (!self.fd) { - self.type = 'unix_dgram'; - self.fd = socket(self.type); + try { + if (!self.fd) { + self.type = 'unix_dgram'; + self.fd = socket(self.type); + } + var bytes = sendto(self.fd, buffer, offset, length, 0, port, addr); + } catch (e) { + if (callback) callback(e); + return; } - sendto(self.fd, buffer, offset, length, 0, port, addr); + + if (callback) callback(null, bytes); + } else { dns.lookup(arguments[1], function (err, ip, addressType) { + // DNS error if (err) { + if (callback) callback(err); self.emit('error', err); - } else { + return; + } + + try { if (!self.fd) { self.type = addressType == 4 ? 'udp4' : 'udp6'; self.fd = socket(self.type); @@ -165,8 +181,14 @@ Socket.prototype.send = function(port, addr, buffer, offset, length) { self._startWatcher(); }); } - sendto(self.fd, buffer, offset, length, 0, port, ip); + var bytes = sendto(self.fd, buffer, offset, length, 0, port, ip); + } catch (err) { + // socket creation, or sendto error. + if (callback) callback(err); + return; } + + if (callback) callback(null, bytes); }); } }; diff --git a/test/simple/test-dgram-pingpong.js b/test/simple/test-dgram-pingpong.js index 61a736ae12..a450f73867 100644 --- a/test/simple/test-dgram-pingpong.js +++ b/test/simple/test-dgram-pingpong.js @@ -4,7 +4,9 @@ var dgram = require("dgram"); var tests_run = 0; + function pingPongTest (port, host) { + var callbacks = 0; var N = 500; var count = 0; var sent_final_ping = false; @@ -17,7 +19,9 @@ function pingPongTest (port, host) { if (/PING/.exec(msg)) { var buf = new Buffer(4); buf.write('PONG'); - server.send(rinfo.port, rinfo.address, buf, 0, buf.length); + server.send(rinfo.port, rinfo.address, buf, 0, buf.length, function (err, sent) { + callbacks++; + }); } }); @@ -58,6 +62,7 @@ function pingPongTest (port, host) { assert.equal(N, count); tests_run += 1; server.close(); + assert.equal(N-1, callbacks); }); client.addListener("error", function (e) {