今天记udp/数据报套接字和dns。
udp
UDP/数据报套接字 => require('dgram');
dgram.createServer([type],[cb]);
type:可以是'udp4','udp6';
cb:message事件监听器;
返回Socket对象
如果您想接收数据报则可调用 socket.bind。socket.bind() 会绑定到“所有网络接口”地址的一个随机端口(udp4 和 udp6 皆是如此)
然后您可以通过 socket.address().address 和 socket.address().port 来取得地址和端口。
类dgram.Socket //封装了数据报功能,可通过createSocket创建
//事件message msg Buffer对象,消息; rinfo OBJ远程地址信息;
socket.on('message',function(msg,rinfo){ console.log('收到%d字节,来自%s:%d ',msg.length,rinfo.address,rinfo.port); })
//事件listening 套接字开始监听数据报时产生,会在udp套接字被创建时发生
//事件close ,error
socket.send(buf,offset,length,port,address,[cb])
buf Buffer 对象,要发送的消息
offset Integer,Buffer 中消息起始偏移值。
length Integer,消息的字节数。
port Integer,目标端口
address String,目标 IP
callback Function,可选,当消息被投递后的回调
//对于udp套接字,必须制定模板端口和ip,address参数可是一个字符串,他会被dns解析;
socket.bind(port,[address],[cb]);
port Integer;address String 可选
对于udp套接字,在一个具名端口port和可选地址address上监听数据。
socket.close();
socket.address();
socket.setBroadcast(flag);设置或清除SO_BROADCAST套接字选项。当该选项被设置,则udp报文可能被发送到一个本地接口的广播地址;
socket.setTTL(ttl);设置IP_TTL套接字选项;参数介于1-255的跃点数。大多数系统缺省为64;
socket.setMulticastTTL(ttl)设置IP_MULTICAST_TTL套接字选项。
socket.unref()。。。
socket.ref()
来个udp客户端的例子,udp不是node的流,只eventEmitter的实例,通过bind监听端口,udp虽然连接多,安全性低,但它不通过tcp三次握手,速度快,一个套接字可以连多个客户端,下面介绍的dns服务器就是udp的应用。
message回调里面一个是message,另一个rinfo是客户端的地址。
var dgram=require("dgram"); var server=dgram.createSocket("udp4"); server.on("message",function(msg,rinfo){ console.log("server got:"+msg+"from"+rinfo.address+":"+rinfo.port); }) server.on("listening",function(){ var address=server.address(); console.log("server listening "+address.address+":"+address.port); }) server.bind(41234);
下面是客户端:
var dgram=require("dgram"); var message=new Buffer("sting 哈哈"); var client=dgram.createSocket("udp4"); client.send(message,0,message.length,41234,"localhost",function(err,bytes){ client.close(); })
udp传输的是一个buffer对象,send的参数是message,offset偏移量,数据长度,连接端口和host,还有回调。
复制代码自行检测。
DNS
dns.lookup(domain, [family], callback);//将一个域名解析为第一个找到的A记录(ipv4)或AAAA记录(ipv6)
//地址族family可以是4,6.缺省为null。 回调参数为cb(err,address,family)
dns.resolve(domain,[rrtype],cb)//将一个域名解析为一个rrtype指定记录类型的数组。有效rrytype取值有A,AAAA,MX,TX,SRV,PTR,NS,CNAME
//回调参数为(err,addresses)其中addresses中每一项的类型取决于记录类型;
dns.resolve4/6(domain,cb) //只用于查询IPv4记录;addresses是一个ipv4地址的数组;
dns.resolveMx(domain,cb);类似于resolve但用于邮件交换查询(MX记录)
dns.reloveTxt/Srv/Cname/Ns(domain,cb);
dns.reverse(ip,cb);反响解析IP地址,返回指向该ip地址的域名数组;cb(err,domains)
dns.getServers();已字符串返回一个当前用于解析的ip地址的数组;
dns.setServers(servers)指定一个ip地址字符串数组,将它们作为解析所用的服务器