【发布时间】:2012-11-16 03:02:24
【问题描述】:
在http.request 或net.connect 中,是否有可以指定网络接口来启动连接的选项?
编辑:操作系统级别的 AFAIK 我可以在路由表中指定地址级别或负载平衡。但是在我的软件中选择界面的方式不止这些,我想知道我是否可以在代码中做到这一点。
【问题讨论】:
标签: node.js http tcp network-interface
在http.request 或net.connect 中,是否有可以指定网络接口来启动连接的选项?
编辑:操作系统级别的 AFAIK 我可以在路由表中指定地址级别或负载平衡。但是在我的软件中选择界面的方式不止这些,我想知道我是否可以在代码中做到这一点。
【问题讨论】:
标签: node.js http tcp network-interface
Node 内置了这个:
http://nodejs.org/api/net.html#net_net_connect_options_connectionlistener
http://nodejs.org/api/http.html#http_http_request_options_callback
请参阅localAddress,只需将其设置为您要使用的接口的 IP。
【讨论】:
编辑:正如 mak 所指出的,确实可以从用户进程中指定网络接口。我站得更正了。但是,我还没有找到一个允许它使用节点的模块。
默认情况下,网络接口由操作系统路由表确定。
您可以在 Unix 系统(包括 OSX)上使用netstat -r 列出此表。只需打开一个终端并输入命令。您将获得如下列表:
laurent ~ $ netstat -r
Routing tables
Internet:
Destination Gateway Flags Refs Use Netif Expire
default 192.168.1.1 UGSc 153 0 en0
127 localhost UCS 0 0 lo0
localhost localhost UH 2 42 lo0
...
Netif 字段为您提供用于路由的网络接口。您还可以使用route 获取用于访问主机名的接口:
laurent ~ $ route get google.fr
route to: par03s02-in-f23.1e100.net
destination: default
mask: default
gateway: 192.168.1.1
interface: en0
flags: <UP,GATEWAY,DONE,STATIC,PRCLONING>
recvpipe sendpipe ssthresh rtt,msec rttvar hopcount mtu expire
0 0 0 0 0 0 1500 0
这更像是服务器故障,但您可以使用route 命令更改路由。例如,这会将流量路由到 eth0 上的 X.Y.Z.[0-254] 到 X.Y.Z.254:
route add -net X.Y.Z.0/24 gw X.Y.Z.254 dev eth0
如果您希望路由保持重启,您可以将它们添加到/etc/network/interfaces。如果你想在几个不同的路由之间进行负载均衡,你还应该检查MPLS。
【讨论】:
您可以使用node cURL wrapper
curl = require('node-curl')
curl('www.google.com', { INTERFACE: 'eth1', RAW: 1 }, function(err) {
console.info(this);
});
【讨论】: