bind()
của INADDR_ANY
không KHÔNG "tạo một IP ngẫu nhiên". Nó liên kết ổ cắm với tất cả các giao diện có sẵn .
Đối với một máy chủ, bạn thường muốn liên kết với tất cả các giao diện - không chỉ "localhost".
Nếu bạn chỉ muốn liên kết socket của mình với localhost, thì cú pháp sẽ là my_sockaddress.sin_addr.s_addr = inet_addr("127.0.0.1");
, sau đó gọi bind(my_socket, (SOCKADDR *) &my_sockaddr, ...)
.
Khi nó xảy ra, INADDR_ANY
là một hằng số xảy ra bằng "không":
http://www.castaglia.org/proftpd/doc/devel-guide/src/include/inet.h.html
# define INADDR_ANY ((unsigned long int) 0x00000000)
...
# define INADDR_NONE 0xffffffff
...
# define INPORT_ANY 0
...
Nếu bạn chưa quen thuộc với nó, tôi khuyên bạn nên xem Hướng dẫn Lập trình Sockets của Beej:
http://beej.us/guide/bgnet/
Vì mọi người vẫn đang đọc cái này, một lưu ý bổ sung:
người đàn ông (7) ip :
Khi một tiến trình muốn nhận các gói hoặc kết nối mới, nó phải liên kết một socket với một địa chỉ giao diện cục bộ bằng cách sử dụng bind (2) .
Trong trường hợp này, chỉ một ổ cắm IP có thể được liên kết với bất kỳ cặp cục bộ (địa chỉ, cổng) nào. Khi INADDR_ANY được chỉ định trong lệnh gọi liên kết, socket sẽ được liên kết với tất cả các giao diện cục bộ.
Khi nghe (2) được gọi trên một ổ cắm không liên kết, ổ cắm sẽ tự động được liên kết với một cổng miễn phí ngẫu nhiên với địa chỉ cục bộ được đặt thành INADDR_ANY.
Khi kết nối (2) được gọi trên một ổ cắm không liên kết, ổ cắm sẽ tự động được liên kết với một cổng miễn phí ngẫu nhiên hoặc với một cổng chia sẻ có thể sử dụng được với địa chỉ cục bộ được đặt thành INADDR_ANY ...
Có một số địa chỉ đặc biệt: INADDR_LOOPBACK (127.0.0.1) luôn tham chiếu đến máy chủ cục bộ thông qua thiết bị loopback; INADDR_ANY (0.0.0.0) có nghĩa là bất kỳ địa chỉ nào để ràng buộc ...
Cũng thế:
bind () - Liên kết tên với một ổ cắm :
Nếu trường (sin_addr.s_addr) được đặt thành hằng số INADDR_ANY, như được định nghĩa trong netinet / in.h, người gọi yêu cầu rằng socket được liên kết với tất cả các giao diện mạng trên máy chủ. Sau đó, các gói UDP và kết nối TCP từ tất cả các giao diện (khớp với tên liên kết) được chuyển đến ứng dụng. Điều này trở nên quan trọng khi một máy chủ cung cấp dịch vụ cho nhiều mạng. Bằng cách để địa chỉ không xác định, máy chủ có thể chấp nhận tất cả các gói UDP và các yêu cầu kết nối TCP được thực hiện cho cổng của nó, bất kể giao diện mạng mà các yêu cầu đến.
htonl(INADDR_ANY)
. Tài liệu nói rằng hàm này tạo ra một IP ngẫu nhiên ... " Điều này không chính xác. Tài liệu nào nói với bạn như vậy?