일부 소켓을 프로그래밍하려고하므로 서버 측에서 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_ANY
소켓을 특정 IP에 바인딩 할 필요가 없을 때 사용됩니다. 를 호출 할 때이 값을 주소로 사용 bind()
하면 소켓은 컴퓨터의 모든 IP에 대한 연결을 허용합니다.
답변
에 바인드 와 소켓 로컬 호스트 인보 당신 전에 바인드 기능의를 sockaddr_in 구조의 sin_addr.s_addr 필드는 적절하게 설정해야합니다. 적절한 값은 다음 중 하나를 통해 얻을 수 있습니다.
my_sockaddress.sin_addr.s_addr = inet_addr("127.0.0.1")
또는
my_sockaddress.sin_addr.s_addr=htonl(INADDR_LOOPBACK);
답변
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 매핑 주소).
답변
INADDR_ANY는 value에 0을 포함하는 상수입니다. 이것은 ip-add에 신경 쓰지 않는 모든 활성 포트에서 연결하려는 경우에만 사용됩니다. 따라서 특정 IP를 연결하려면 my_sockaddress.sin_addr.s_addr = inet_addr ( “192.168.78.2”)와 같이 언급해야합니다.