일부 소켓을 프로그래밍하려고하므로 서버 측에서 htonl(INADDR_ANY)
. 내가 이해하는 한,이 함수는 임의의 IP를 생성하는 것 같습니다 (제가 맞습니까?). 사실, 내 소켓을 localhost
. 하지만 내가 이것을 실행하면
printf("%d",htonl(INADDR_ANY));
반환 값으로 0을 얻습니다. 누군가 설명을 할 수 있습니까?
답변:
bind()
의 "임의의 IP를 생성" INADDR_ANY
하지 않습니다 . 그것은 가능한 모든 인터페이스에 소켓을 바인드합니다 .
서버의 경우 일반적으로 "localhost"뿐 아니라 모든 인터페이스에 바인딩하려고합니다.
소켓을 localhost에만 바인딩하려는 경우 구문은 my_sockaddress.sin_addr.s_addr = inet_addr("127.0.0.1");
이고 bind(my_socket, (SOCKADDR *) &my_sockaddr, ...)
.
공교롭게도, INADDR_ANY
"제로"를 동일하게 발생하는 일정은 다음과 같습니다
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
...
아직 익숙하지 않다면 Beej의 소켓 프로그래밍 가이드를 확인하시기 바랍니다.
사람들이 여전히 이것을 읽고 있으므로 추가 메모 :
프로세스가 새로운 수신 패킷이나 연결을 수신하려면 bind (2)를 사용하여 소켓을 로컬 인터페이스 주소에 바인딩해야합니다 .
이 경우 하나의 IP 소켓 만 주어진 로컬 (주소, 포트) 쌍에 바인딩 될 수 있습니다. INADDR_ANY가 바인드 호출에 지정되면 소켓은 모든 로컬 인터페이스에 바인드됩니다.
들을 때 (2) 언 바운드 소켓이라고, 소켓이 자동으로 INADDR_ANY 로컬 주소 세트를 임의의 사용 가능한 포트에 바인딩됩니다.
연결할 때 (2) 언 바운드 소켓이라고, 소켓이 자동으로 임의의 사용 가능한 포트 또는 INADDR_ANY 로컬 주소를 세트로 사용 가능한 공유 포트에 바인딩 ...
몇 가지 특수 주소가 있습니다. INADDR_LOOPBACK (127.0.0.1)은 항상 루프백 장치를 통해 로컬 호스트를 참조합니다. INADDR_ANY (0.0.0.0)는 바인딩 할 주소를 의미합니다.
또한:
(sin_addr.s_addr) 필드가 netinet / in.h에 정의 된 상수 INADDR_ANY로 설정되면 호출자는 소켓이 호스트의 모든 네트워크 인터페이스에 바인딩되도록 요청합니다. 그 후 모든 인터페이스 (바인드 된 이름과 일치)의 UDP 패킷 및 TCP 연결이 애플리케이션으로 라우팅됩니다. 이것은 서버가 여러 네트워크에 서비스를 제공 할 때 중요합니다. 주소를 지정하지 않은 상태로두면 서버는 요청이 도착한 네트워크 인터페이스에 관계없이 포트에 대한 모든 UDP 패킷 및 TCP 연결 요청을 수락 할 수 있습니다.
INADDR_LOOPBACK
대신 사용할 수 inet_addr("127.0.0.1")
없습니까?
INADDR_ANY
사용 가능한 모든 인터페이스에 바인딩하도록 청취 소켓에 지시합니다. 바인딩을 시도하는 것과 같습니다 inet_addr("0.0.0.0")
. 완전성을 위해 IPv6의 경우 IN6ADDR_ANY_INIT 도 있으며::
IPv6 소켓의 주소에 바인딩하려는 것과 동일 하다는 점도 언급 하겠습니다 .
#include <netinet/in.h>
struct in6_addr addr = IN6ADDR_ANY_INIT;
또한 IPv6 소켓을 IN6ADDR_ANY_INIT
소켓에 바인딩하면 모든 IPv6 인터페이스에 바인딩되며 IPv4 클라이언트의 연결도 허용 할 수 있어야합니다 (IPv6 매핑 주소).
htonl(INADDR_ANY)
.이 함수는 임의의 IP를 생성한다고 문서에 나와 있습니다 ... "이것은 올바르지 않습니다. 어떤 문서가 그렇게 말합니까?