소켓 프로그래밍의 INADDR_ANY에 대해서
의 소켓을 있기 에서는 「소켓」을 .따라서 서버 측에서는htonl(INADDR_ANY)
제가 알기론 이 함수는 랜덤 IP를 생성하는 것 같습니다(맞습니까?).저는 제 을 제 소켓으로 .localhost
이 '이'를 '
printf("%d",htonl(INADDR_ANY));
반환값으로 0을 받습니다.누가 설명 좀 해주시겠어요?
bind()
INADDR_ANY
는 랜덤 IP를 생성하지 않습니다.소켓을 사용 가능한 모든 인터페이스에 바인드합니다.서버의 경우 일반적으로 "localhost"뿐만 아니라 모든 인터페이스에 바인드해야 합니다.
은 "localhost" 입니다.
my_sockaddress.sin_addr.s_addr = inet_addr("127.0.0.1");
전화하세요.bind(my_socket, (SOCKADDR *) &my_sockaddr, ...)
도 ★★★★★★★★★★★★★★★★★.
INADDR_ANY
"되는 입니다. "0"은 "0"이 될 수 있습니다.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's Guide to Sockets Programming:
아직 사람들이 읽고 있기 때문에 추가 주의사항:
프로세스가 새로운 착신 패킷 또는 접속을 수신하는 경우 bind(2)를 사용하여 소켓을 로컬인터페이스 주소로 바인드해야 합니다.
이 경우 임의의 로컬(주소, 포트) 쌍에 바인드할 수 있는IP 소켓은 1개뿐입니다.바인드 콜에서 INADDR_ANY가 지정되어 있는 경우 소켓은 모든 로컬인터페이스에 바인드 됩니다.
listen(2)이 언바인드소켓으로 호출되면 소켓은 로컬주소가 INADDR_ANY로 설정된 랜덤프리 포트에 자동으로 바인드 됩니다.
connect (2)가 언바인드소켓으로 호출되면 소켓은 로컬주소가 INADDR_ANY로 설정된 랜덤프리 포트 또는 사용 가능한 공유 포트에 자동으로 바인드 됩니다.
몇 가지 특별한 주소가 있습니다.INADDR_LOOPBACK(127.0.0.1)은 항상 루프백디바이스 경유로 로컬호스트를 참조합니다.INADDR_ANY(0.0.0)는 바인딩용 임의의 주소를 의미합니다.
기타:
(sin_addr).s_addr) 필드는 netinet/in.h에서 정의된 바와 같이 INADDR_ANY 상수로 설정되어 있습니다.발신자는 소켓을 호스트상의 모든 네트워크인터페이스에 바인드 하도록 요구하고 있습니다.그 후, 모든 인터페이스로부터의 UDP 패킷과 TCP 접속(바인드명과 일치)이 애플리케이션에 라우팅 됩니다.이것은 서버가 여러 네트워크에 서비스를 제공할 때 중요합니다.주소를 지정하지 않는 것으로, 서버는, 요구가 도착한 네트워크 인터페이스에 관계없이, 포토에 대해서 행해진 모든 UDP 패킷 및 TCP 접속 요구를 받아들일 수 있습니다.
INADDR_ANY
소켓을 특정 IP에 바인드할 필요가 없을 때 사용합니다.를 호출할 때 이bind()
IP를 사용하다
INADDR_ANY
는 사용 가능한 모든 인터페이스에 바인드하도록 리스닝 소켓에 지시합니다.결속하다'와 같이 '하다'와 같은 죠.inet_addr("0.0.0.0")
또, IPv6 용 IN6 ADDR_ANY_INIT 도 있어, 바인드 하는 것과 같습니다.::
IPv6 ip ip ip 。
#include <netinet/in.h>
struct in6_addr addr = IN6ADDR_ANY_INIT;
을 에 바인드 , IPv6 의 「」에 바인드 하는 것에 해 주세요.IN6ADDR_ANY_INIT
소켓이 모든 IPv6 인터페이스에 바인드 되어 IPv4 클라이언트로부터의 접속도 받아 들일 수 있습니다(IPv6 매핑주소).
소켓을 localhost와 바인드하려면 바인드 함수 sin_addr을 호출합니다.sockaddr_in 구조의 s_addr 필드를 올바르게 설정해야 합니다.적절한 값은 다음 중 하나에 의해 얻을 수 있습니다.
my_sockaddress.sin_addr.s_addr = inet_addr("127.0.0.1")
또는 에 의해
my_sockaddress.sin_addr.s_addr=htonl(INADDR_LOOPBACK);
서버가 있는 경우는, 소켓을 작성해, IP 와 포토에 바인드 합니다.이것에 의해, 소켓은 고유의 소켓 타입, 주소 패밀리, IP 및 포토에 근거해 식별됩니다.다음으로 listen()을 실행하여 소켓을 서버 모드로 설정하고 다음으로 수신()을 받아들입니다.접속에서는 패킷이 그 소켓 상에서 큐잉되는 원인이 되는 타깃 IP/포트를 가진 착신 패킷이 대기합니다.IP 에 바인드 할 필요는 없습니다만, 모든 인터페이스로 접속을 받아들일 수 있습니다.
클라이언트가 있는 경우 소켓을 만들고 소켓을 리모트 IP 및 포트에 연결합니다().소켓에 0.0.0.0 및 임의의 미사용 ephemeral 포트가 bind(INADDR_ANY, 0)를 사용하여 아직 바인드되지 않은 경우 소켓에 바인드됩니다(INADR_ANY, 0). 이 소켓은 연결 시 반환되며 소스 주소의 IP 및 포트로서 사용됩니다.utbound 패킷.여기서 0.0.0은 항상 라우팅 테이블 내의 src 힌트 또는 선택한 인터페이스의 IP(복수의 IP가 있는 경우 동일하거나 더 큰 범위의 첫 번째 IP가 선택됨)에 기초한 IP로 대체되며, 그 후 sendall을 사용하여 응용 프로그램데이터를 송신합니다.
INADDR_ANY 는, 언제라도 변경될 가능성이 있는 인터페이스의 현재의 내부 IP 를 프로그래밍 방식으로 취득하는 것보다 고속입니다.또, 패킷은 포토상에서 수신되지 않게 됩니다만, 어느 주소라도 0.0.0 으로 수신됩니다.
소켓은 0.0.0.0에 바인드할 수 있지만 포트 0에는 바인드할 수 없습니다.이는 소켓에 랜덤에페머럴포트를 부여하는 와일드카드이기 때문입니다.따라서 바인드(INADDR_ANY, 0)를 사용하면 0.0.0 및 랜덤에페머럴포트에 바인드 됩니다.
INADDR_ANY는 값 0을 포함하는 상수입니다.이것은 ip-add에 관심이 없는 모든 활성 포트에서 연결하는 경우에만 사용됩니다.따라서 특정 IP를 연결하는 경우 my_sockaddress.sin_addr과 같이 지정해야 합니다.s_addr = inet_addr192.168.78.2")
#include <arpa/inet.h>
.
.
tcpsock.sin_addr.s_addr = inet_addr("192.168.1.2")
나를 위해 일했다
언급URL : https://stackoverflow.com/questions/16508685/understanding-inaddr-any-for-socket-programming
'source' 카테고리의 다른 글
[Vue warn] :렌더 오류: "TypeError: 정의되지 않은 속성 'getters'를 읽을 수 없습니다." (0) | 2022.08.29 |
---|---|
웹 팩을 사용하여 하나의 프로젝트에서 여러 Vuejs 컴포넌트를 npm에 게시합니다. (0) | 2022.08.28 |
Vue js 마운트된 특정 div로 스크롤 (0) | 2022.08.28 |
Javascript Package Manager를 사용하지 않고 VueJS 플러그인 포함 (0) | 2022.08.28 |
헤더에 #include를 사용해야 합니까? (0) | 2022.08.28 |