2015-04-28 16 views
11

Tôi đang cố gắng chuyển một chương trình TraceRoute từ Linux sang OSX và tôi gặp sự cố khi tìm thấy tương đương IP_RECVERR.Tương đương OSX cho IP_RECVERR

Cách hầu hết mọi người làm phân tích gói tin là:

setsockopt (sock, IPPROTO_IPV4, IP_RECVERR, &on, sizeof (on)) 

Và sau đó khi các gói tin đi kèm trong làm điều gì đó dọc theo dòng:

sock_extended_err* err = nullptr; 
for (cmsghdr* cmsg = CMSG_FIRSTHDR(&msg); cmsg; cmsg = CMSG_NXTHDR(&msg, cmsg)) { 
    switch (cmsg->cmsg_level) { 
    case IPPROTO_IPV4: 
     if (cmsg->cmsg_type == IP_RECVERR) { 
     err = (sock_extended_err*)CSMSG_DATA(cmsg); 
     } 
     break; 
    } 
} 

Cũng không phải là một sock_extended_err trên OSX có vấn đề. Tôi thực sự chỉ cần biết nếu đã có một lỗi, và nơi mà các lỗi có nguồn gốc.

+0

Trên 'OS X' điều gần nhất (được tích hợp sẵn) có thể là' SO_ERROR'. –

+0

Nó không giống như nó có một lỗi "TTL đến 0". – kmdent

+0

Khi bạn đang sử dụng 'IP_RECVERR' loại giá trị nào nó trả về? Nếu bạn muốn nhận giá trị 'TTL' thực tế, bạn sẽ phải sử dụng một cái gì đó như' getockopt (fd, SOL_SOCKET, SO_ERROR, & errcode, &len); ' –

Trả lời

1

Xin lỗi để nói nhưng OS X không hỗ trợ khả năng mở rộng IP_RECVERR ổ cắm.

Bạn có thể sử dụng: #ifdef IP_RECVERR để làm cho nó được xây dựng trên OS X, nơi RECVERR/ERRQUEUE không tồn tại.

Nhưng nếu bạn đang tìm kiếm mã thực thi cụ thể đó, tôi nghĩ bạn phải chuyển đổi cổng IP_RECVERR khả năng ổ cắm & MSG_ERRQUEUE trong mac OS X. Thats có vẻ như "Tôi có những thứ mới để phát". Chúc mừng mã hóa.

+0

Mặc dù điều này không giải quyết được vấn đề, Tôi sẽ không để tiền thưởng đó bị lãng phí! – kmdent

+0

Cảm ơn người đàn ông .. –

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