2012-11-28 28 views
7

Trong http.request hoặc net.connect, có tùy chọn nào để tôi có thể chỉ định giao diện mạng để bắt đầu kết nối không?Làm thế nào để chỉ định một giao diện mạng khi thực hiện các yêu cầu mạng từ Node.js?

CHỈNH SỬA: AFAIK ở cấp hệ điều hành Tôi có thể chỉ định cấp địa chỉ hoặc cân bằng tải vào bảng định tuyến. Nhưng cách lựa chọn giao diện trong phần mềm của tôi là nhiều hơn thế, tôi muốn biết nếu tôi có thể làm điều đó trong mã.

Trả lời

3

Node đã được xây dựng trong:

http://nodejs.org/api/net.html#net_net_connect_options_connectionlistener

http://nodejs.org/api/http.html#http_http_request_options_callback

Xem localAddress, chỉ cần đặt đó đến IP của giao diện bạn muốn thích sử dụng.

+1

Sau thời gian tôi hỏi câu hỏi này, tôi thấy đây có thể là cách tiếp cận tốt nhất. Tôi có thể nhóm các địa chỉ bằng os.networkInterfaces(). – Vicary

3

EDIT: Như được chỉ ra, thực sự có thể chỉ định giao diện mạng từ quy trình người dùng. Tôi đứng sửa. Tuy nhiên, tôi vẫn chưa tìm thấy một mô-đun cho phép nó với nút.

Theo mặc định, giao diện mạng được xác định bởi bảng định tuyến OS.

Bạn có thể liệt kê bảng này với netstat -r trên các hệ thống Unix (bao gồm OSX). Chỉ cần mở một thiết bị đầu cuối và gõ lệnh. Bạn sẽ nhận được một danh sách như:

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 
... 

Trường Netif cung cấp cho bạn giao diện mạng được sử dụng cho tuyến đường. Bạn cũng có thể nhận được các giao diện sử dụng để đạt được một hostname với 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 

Đây là thêm một điều serverfault, nhưng bạn có thể thay đổi các tuyến đường với lệnh route. Ví dụ, giao thông ý chí tuyến đường này để X.Y.Z. [0-254] để X.Y.Z.254 trên eth0:

route add -net X.Y.Z.0/24 gw X.Y.Z.254 dev eth0 

Nếu bạn muốn các tuyến đường để tồn tại khi khởi động lại, bạn có thể thêm chúng vào /etc/network/interfaces. Nếu bạn muốn tải cân bằng giữa một số tuyến đường khác nhau, bạn cũng nên kiểm tra MPLS.

+0

Cảm ơn bạn đã giải thích về cách nhận thông tin. Vậy làm cách nào tôi có thể chỉ định tuyến đường? Tôi sẽ cập nhật câu hỏi của mình để cung cấp thêm thông tin, những gì tôi yêu cầu là một phương thức có thể chỉ định bằng mã. Tôi hiểu nó có thể là một NO đơn giản. : D – Vicary

+0

Nó thực sự là có thể tự xác định các tuyến đường. Bạn đang nhắm mục tiêu hệ điều hành nào? –

+0

Trường hợp của tôi là CentOS và OSX (Darwin), nhưng nhiều hơn có thể đến, chủ yếu là không giống như Unix. – Vicary

1

Bạn có thể sử dụng node cURL wrapper

curl = require('node-curl') 
curl('www.google.com', { INTERFACE: 'eth1', RAW: 1 }, function(err) { 
    console.info(this); 
}); 
+0

Cảm ơn câu trả lời, curl là một cách hay để bắt đầu. Nhưng việc chuyển tất cả các mã của tôi thành nút-curl không giống như một tùy chọn. Tôi thực sự muốn giữ những thứ net.connect và http.request gốc. – Vicary

Các vấn đề liên quan