2013-06-25 43 views
5

Tôi có một máy kết nối với nhiều mạng độc lập, mỗi mạng trên một NIC khác nhau (Thẻ Giao diện Mạng). Máy chạy Windows 7.Cách chỉ định một NIC cụ thể được sử dụng trong một ứng dụng được viết bằng C++ (boost asio)

Tôi chạy một ứng dụng trên máy cần kết nối với một IP cụ thể thông qua một NIC cụ thể, sử dụng TCP. Ứng dụng sử dụng C++ 11 và tăng cường asio (1.53.0) cho mạng, và nguồn có thể được thay đổi.

Các cách hợp lý khác nhau để giải quyết vấn đề này (chỉ định IP điểm cuối và NIC) trong môi trường Windows là gì?

Giải pháp hiện tại chỉ định các IP tương ứng (khối) cho NIC bên phải trong bảng định tuyến - bằng cách sử dụng lệnh "tuyến đường" dòng lệnh - làm các tuyến cố định. Bằng cách đó, hệ điều hành xử lý vấn đề, được cho phép nhưng không bắt buộc.

Trả lời

3

Bạn nên open()bind() ổ cắm vào endpoint trước khi kết nối. Trong ví dụ này, tôi ràng buộc nó với giao diện loopback, trong kịch bản của bạn, bạn có thể liên kết với giao diện cho NIC của bạn.

#include <boost/asio.hpp> 

int 
main() 
{ 
    using namespace boost::asio; 
    io_service ios; 
    ip::tcp::socket sock(ios); 
    sock.open(ip::tcp::v4()); 
    sock.bind(ip::tcp::endpoint(ip::address::from_string("127.0.0.1"), 0)); 
    sock.connect(ip::tcp::endpoint(ip::address::from_string("127.0.0.1"), 1234)); 
} 

Tôi không phải là lập trình viên Windows nên tôi không thể cung cấp ví dụ chi tiết hơn điều này. Tôi tin rằng bạn có thể liệt kê thông qua các giao diện NIC bằng cách sử dụng GetAdaptersAddresses. Trên Linux, tôi sẽ sử dụng getifaddrs(3).

+0

Vì vậy điểm cuối liên kết chỉ định NIC, trong khi điểm cuối kết nối là điểm cuối đích thông thường, đúng không? Nếu đó là chính xác cho đến nay, tôi đang bị mắc kẹt về cách để có được một điểm cuối chỉ định một NIC. – Peter

+0

@Peter có bạn là chính xác, mỗi điểm cuối chỉ định một phần của 4 cổng TCP của khách hàng: IP của khách hàng, cổng máy khách, máy chủ IP, cổng máy chủ. Đối với điểm cuối của máy khách, bạn nên sử dụng địa chỉ IP cho NIC đó và số không để chọn một cổng tạm thời. –

+0

Cảm ơn. Vì vậy, dựa trên thông tin bổ sung tại đây: http://stackoverflow.com/questions/6594523/how-could-i-get-or-change-the-ip-address-of-a-disconnected-nic-in-windows Người ta có thể sử dụng một thuộc tính tĩnh của NIC, chẳng hạn như MAC, để chỉ định một NIC trong một cấu hình. Sau đó, tại thời gian chạy sử dụng một cuộc gọi cụ thể hệ điều hành - chẳng hạn như những người bạn đã đề cập - để có được IP của NIC với MAC được chỉ định, và sau đó sử dụng NIC IP để kết nối socket với NIC. – Peter

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