source

소켓 프로그래밍의 INADDR_ANY에 대해서

factcode 2022. 8. 28. 09:33
반응형

소켓 프로그래밍의 INADDR_ANY에 대해서

의 소켓을 있기 에서는 「소켓」을 .따라서 서버 측에서는htonl(INADDR_ANY)제가 알기론 이 함수는 랜덤 IP를 생성하는 것 같습니다(맞습니까?).저는 제 을 제 소켓으로 .localhost 이 '이'를 '

printf("%d",htonl(INADDR_ANY));

반환값으로 0을 받습니다.누가 설명 좀 해주시겠어요?

  1. bind()INADDR_ANY는 랜덤 IP를 생성하지 않습니다.소켓을 사용 가능한 모든 인터페이스에 바인드합니다.

  2. 서버의 경우 일반적으로 "localhost"뿐만 아니라 모든 인터페이스에 바인드해야 합니다.

  3. 은 "localhost" 입니다.my_sockaddress.sin_addr.s_addr = inet_addr("127.0.0.1"); 전화하세요.bind(my_socket, (SOCKADDR *) &my_sockaddr, ...)

  4. 도 ★★★★★★★★★★★★★★★★★.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
    ...
    
  5. 아직 익숙하지 않다면 Beej's Guide to Sockets Programming:

    http://beej.us/guide/bgnet/

아직 사람들이 읽고 있기 때문에 추가 주의사항:

man(7) IP:

프로세스가 새로운 착신 패킷 또는 접속을 수신하는 경우 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)는 바인딩용 임의의 주소를 의미합니다.

기타:

bind() : 이름을 소켓에 바인드합니다.

(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

반응형