2008-12-02 28 views
19

Tôi có một máy chủ với hai giao diện mạng khác nhau, mỗi giao diện có một địa chỉ IP khác nhau. Làm thế nào tôi có thể tạo một ổ cắm để nó sẽ đi ra một địa chỉ IP cụ thể?Làm cách nào để tạo một ổ cắm đi đến giao diện mạng SPECIFIC?

Tôi thích ví dụ python hơn, nhưng câu hỏi là ngôn ngữ bất khả tri, vì vậy hãy quay đi.

EDIT: Vui lòng không cho tôi "Bạn không thể" làm câu trả lời. Ý tôi là, nó là một máy tính. Tôi có thể làm bất cứ điều gì tôi thích nó, ví dụ - tôi có thể lập trình vô hiệu hóa một giao diện tôi không muốn trên bay. Tôi đang tìm thứ gì đó đẹp hơn.

Trả lời

12

Bạn chắc chắn có thể kết nối ổ cắm với một thiết bị cụ thể.

Tôi không biết làm thế nào để làm điều đó trong python, nhưng bằng cách sử dụng api socket beri (trong C), bạn cần phải gọi setsockopt(), sử dụng tùy chọn SO_BINDTODEVICE.

Bạn chuyển qua một bộ mô tả giao diện, thuộc loại struct ifreq. Lý tưởng nhất là bạn sẽ nhận được nội dung của bộ mô tả giao diện bằng cách sử dụng ioctl() và yêu cầu SIOCGIFINDEX - chuyển tên của giao diện (ví dụ: eth0) làm đối số.


chỉnh sửa: Chỉ cần tìm kiếm nhanh và tìm thấy tài liệu this về phương pháp socket trong python. setsockopt() là một trong số đó.

+0

Cảm ơn bạn rất nhiều! Tôi sẽ thử và báo cáo lại. – Mikle

+0

Chỉ hoạt động với Linux. Còn OS X thì sao? – Dor

11

Chỉ cần một lưu ý nhỏ - những gì tôi thực sự cần là liên kết với một IP cụ thể và chỉ vì mục đích hoàn chỉnh, giải pháp là kết buộc ổ cắm sau khi tạo. Source trong python:

import socket 
s = socket.socket() 
s.bind(("127.0.0.1", 0)) 
s.connect(("321.12.131.432", 80)) 
1
import socket 
s = socket.socket() 
s.bind((get_ip_address('eth0'), 0)) 

từ Quora

+1

Điều này sẽ không hoạt động nếu không có định nghĩa get_ip_address – toth

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