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.
Trên 'OS X' điều gần nhất (được tích hợp sẵn) có thể là' SO_ERROR'. –
Nó không giống như nó có một lỗi "TTL đến 0". – kmdent
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); ' –