2012-07-20 20 views
8

Beej's Simple Client mã ví dụ lặp qua tất cả các địa chỉ IP được trả về từ getaddrinfo(), cho đến khi nó có thể kết nối với địa chỉ đầu tiên. Xem mã bên dưới.Có cần thiết phải kết nối với tất cả các địa chỉ được trả về bởi getaddrinfo() không?

Điều này luôn luôn cần thiết, hoặc là OK để cho rằng chúng tôi chỉ phải cố gắng kết nối với địa chỉ đầu tiên được trả về bởi getaddrinfo()?

memset(&hints, 0, sizeof hints); 
hints.ai_family = AF_UNSPEC; 
hints.ai_socktype = SOCK_STREAM; 

if ((rv = getaddrinfo(argv[1], PORT, &hints, &servinfo)) != 0) { 
    fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(rv)); 
    return 1; 
} 

// ------------------------------------------------------------ 
// loop through all the results and connect to the first we can 
for(p = servinfo; p != NULL; p = p->ai_next) { 
    if ((sockfd = socket(p->ai_family, p->ai_socktype, 
      p->ai_protocol)) == -1) { 
     perror("client: socket"); 
     continue; 
    } 

    if (connect(sockfd, p->ai_addr, p->ai_addrlen) == -1) { 
     close(sockfd); 
     perror("client: connect"); 
     continue; 
    } 

    break; 
} 

Trả lời

9

Có, bạn nên lặp qua tất cả các địa chỉ - đặc biệt, hãy xem xét trường hợp máy chủ đích có địa chỉ IPv6 được kích hoạt nhưng máy chủ cục bộ của bạn thì không. getaddrinfo() sẽ trả lại AF_INET6 địa chỉ gia đình, nhưng sau đó cuộc gọi socket() hoặc connect() sẽ không thành công. Nó cũng là khả năng máy chủ của bạn hỗ trợ nhiều giao thức thực hiện SOCK_STREAM (nói, SCTP ngoài TCP) và máy chủ đích không - vì bạn chưa đặt thành viên ai_protocol của cấu trúc gợi ý, địa chỉ đại diện cho tất cả các giao thức hỗ trợ SOCK_STREAM ổ cắm sẽ được trả lại.

0

Giả sử bạn mới sử dụng socket, tại thời điểm này. Có, nó là rất quan trọng bởi vì sau khi sử dụng getaddrinfo, bạn có thể lấy một thông tin địa chỉ để xác nhận thêm.

2

Hãy xem xét theo cách này ... Máy chủ lưu trữ máy chủ bạn muốn kết nối có thể có một số địa chỉ liên kết với nó, nhưng chương trình máy chủ thực chỉ nghe trên một trong các địa chỉ đó. Nếu khách hàng của bạn không biết địa chỉ chính xác mà chương trình máy chủ đang nghe, bạn phải thử tất cả các địa chỉ mà máy chủ lưu trữ có cho đến khi bạn tìm được địa chỉ chính xác và có thể kết nối.

+0

Hoặc thực tế hơn, tại sao máy chủ có nhiều địa chỉ? Việc sử dụng rõ ràng nhất là dự phòng. Nếu máy chủ đầu tiên không phản hồi, bạn có thể có thành công tốt hơn nếu bạn đi bộ danh sách ... – asveikau

+0

@asveikau Lý do thực sự mà máy chủ có nhiều địa chỉ có thể khác nhau. Nó có thể là do sự thừa, hoặc nó có thể được phục vụ hai mạng khác nhau, hoặc vô số các lý do khác. –

+0

Dự phòng hoặc Cân bằng tải. – Lothar

1

Có, bạn nên lặp lại tất cả chúng - không đảm bảo rằng địa chỉ đầu tiên (hoặc bất kỳ thứ gì bạn chọn) của địa chỉ thực sự hợp lệ. Đó là lý do tại sao nó được thực hiện như thế trong hướng dẫn.

4

Ngoài các câu trả lời khác được nêu ở trên, hãy xem xét trường hợp chung cho các trang web lớn hơn và nhiều hơn nữa, có thể xuất bản nhiều bản ghi A cho mục đích dự phòng. Nếu số connect() đến địa chỉ đầu tiên không thành công, bạn cũng muốn thử những người khác.

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