2017-02-15 16 views
7

Tôi rất mới định tuyến tĩnh, khách hàng của chúng tôi yêu cầu triển khai định tuyến tĩnh cho ổ cắm. Khi tôi googled tôi đi qua với rtentry để thiết lập thông tin định tuyến. Khi tôi mở cấu trúc này, tôi thấy các trường để định tuyến tĩnhLàm thế nào để thiết lập nhiều mục định tuyến cho socket?

struct sockaddr rt_dst;  /* Target address. */ 
struct sockaddr rt_gateway;  /* Gateway addr (RTF_GATEWAY). */ 
struct sockaddr rt_genmask;  /* Target network mask (IP). */ 

Nhưng làm cách nào tôi có thể thiết lập nhiều mục nhập tại đây? tạo nhiều rtentry và gọi ioctl(FileDes, SIOCADDRT, &rtentry) sẽ khắc phục sự cố của tôi?

int32_t FileDes = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP); 
for(auto RtEntry : RtEntriesList) 
{ 
    ioctl(FileDes, SIOCADDRT, RtEntry)` 
} 

Nếu tôi định cấu hình, làm cách nào để kiểm tra điều này? Sẽ rất hữu ích nếu bạn có thể cung cấp liên kết để biết thêm về những điều này.

+0

Gilson, bạn có thể mở rộng "khách hàng được yêu cầu triển khai định tuyến tĩnh cho ổ cắm" một phần câu hỏi của bạn chi tiết hơn không? Ổ cắm thường không có bất kỳ lựa chọn định tuyến bổ sung nào, chúng chỉ sử dụng định tuyến được xác định trên toàn hệ thống; và rtentry không dành cho các socket bình thường, nó là cho các socket quản trị để có được và thiết lập định tuyến toàn hệ thống (nó được sử dụng bởi đặc quyền 'route add' command: http://unix.stackexchange.com/questions/274094/can-not -add-static-route-in-my-ubuntu-siocaddrt-mạng-là-không thể truy cập được). – osgx

+0

@osgx, chúng tôi phải sửa đổi tệp/etc/network/interface để cung cấp định tuyến tĩnh. Tôi rõ ràng về phần đó, chúng tôi cũng phải thiết lập các thông tin định tuyến này để giao diện để nó có cấu hình mà không cần khởi động lại. Vì vậy, chúng ta phải thiết lập thông tin định tuyến thông qua các socket quản trị. Vì vậy, tôi bối rối làm thế nào để thiết lập các thông tin này. Họ không muốn thực thi lệnh tuyến hoặc khởi động lại thiết bị để đặt cấu hình định tuyến tĩnh. Tôi hy vọng bạn hiểu rõ về câu hỏi của tôi. –

+0

Gilson, kiểm tra các nguồn của các công cụ 'route' hoặc [' ip route'] (https://access.redhat.com/sites/default/files/attachments/rh_ip_command_cheatsheet_1214_jcs_print.pdf) (sourceforge.net/projects/net-tools ,) và/hoặc làm 'strace' /' ltrace'/'sysdig' của lệnh' route add' được sử dụng để đặt định tuyến mong muốn. – osgx

Trả lời

3

Cuối cùng tôi đã nhận được câu trả lời của mình.

int32_t FileDes = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP); 

struct rtentry Route1; 
struct rtentry Route2; 
struct rtentry Route3; 

// configure Route1 
// configure Route2 
// configure Route3 

RtEntriesList.push_back(&Route1); 
RtEntriesList.push_back(&Route2); 
RtEntriesList.push_back(&Route3); 

for(auto RtEntry : RtEntriesList) 
{ 
    ioctl(FileDes, SIOCADDRT, RtEntry); 
} 

sẽ hoạt động, chúng tôi có thể tạo nhiều mục nhập định tuyến và thêm vào ổ cắm FD. và điều này sẽ cập nhật bảng định tuyến rộng của hệ thống.

tương tự của nó để route add .. lệnh

để thử nghiệm tôi đặt cửa ngõ như địa chỉ máy tính ip của tôi và bắt đầu Wireshark có. sau khi thiết lập cấu hình định tuyến, dải IP nhất định được định tuyến đến máy tính của tôi. Cảm ơn @osgx vì thông tin thực sự thiết lập bảng định tuyến rộng của hệ thống.

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