2013-01-23 39 views
12

Làm cách nào để kết nối ổ cắm với một giao diện mạng cụ thể? Tôi đã thử sử dụng setsockopt ở phía máy chủ, nhưng khách hàng vẫn có thể truy cập dịch vụ thông qua cả giao diện eth0 và lo.liên kết ổ cắm với giao diện mạng

Tôi có thể đạt được điều này bằng cách đặt địa chỉ IP cụ thể bằng cách sử dụng serv_addr.sin_addr.s_addr.

Nhưng tôi nghi ngờ rằng chúng tôi có thể liên kết với giao diện chỉ sử dụng setsockopt (mà không đề cập đến địa chỉ IP).

Trả lời

2

Cách duy nhất bạn có thể làm điều đó là như bạn đề cập đến -

bằng cách thiết lập địa chỉ IP cụ thể sử dụng serv_addr.sin_addr.s_addr

Bạn không thể làm điều đó mà không biết địa chỉ để ràng buộc vào. Bạn có thể sử dụng ioctl s để xác định địa chỉ IP hiện tại nếu bạn cần, mặc dù có thể có một cách thông minh hơn để làm điều này những ngày này - Gần đây tôi đã không thực hiện nhiều trong các bản phân phối Linux hiện đại.

+0

Thnks joe. tôi có thể biết cách sử dụng setsockopt với SO_BINDTODEVICE không? – user2003595

14

Bạn có thể liên kết với giao diện cụ thể bằng cách đặt tùy chọn ổ cắm SO_BINDTODEVICE.

struct ifreq ifr; 

memset(&ifr, 0, sizeof(ifr)); 
snprintf(ifr.ifr_name, sizeof(ifr.ifr_name), "eth0"); 
if (setsockopt(s, SOL_SOCKET, SO_BINDTODEVICE, (void *)&ifr, sizeof(ifr)) < 0) { 
    ... error handling ... 
} 

Warning: Bạn có được root và có khả năng CAP_NET_RAW để sử dụng tùy chọn này.

Phương pháp thứ hai là bạn có thể giải quyết địa chỉ IP được gắn với giao diện với getifaddrs().

Làm theo liên kết sau để có ví dụ toàn diện.

+0

Tôi biết rằng phải có một cách tốt hơn một ioctl! :-) – Joe

+0

Bạn đang đúng .... cập nhật;) –

+0

Tôi có một câu hỏi mới, vì vậy vấn đề eth0 và eth1 có cùng địa chỉ IP bằng phương pháp của bạn không? – Splash

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