문제

  1. 네트워크 어댑터가 여러 개 있습니다.
  2. 주소를 지정하지 않고 UDP 소켓을 로컬 포트에 바인딩합니다.
  3. 어댑터 중 하나에서 패킷을받습니다.

    패킷을 수신 한 어댑터의 로컬 IP 주소는 어떻게 얻습니까?

    질문은 "수신기 어댑터의 IP 주소는 무엇입니까?"입니다.에서받은 발신자의 주소가 아닙니다. 라코 디스

    전화

도움이 되었습니까?

해결책

모든 네트워크 어댑터를 열거하고 해당 IP 주소를 가져 와서 서브넷 마스크가 적용되는 부분을 보낸 사람의 주소와 비교할 수 있습니다.

좋아요 : 라코 디스

다른 팁

G'day,

주소를 지정하기 위해 INADDR_ANY를 사용하여 바인드를 완료했다고 가정합니다.

이 경우 INADDR_ANY의 의미는 모든 인터페이스에 지정된 포트에 UDP 소켓이 생성되는 것과 같습니다.소켓은 지정된 포트의 모든 인터페이스로 전송 된 모든 패킷을 가져옵니다.

이 소켓을 사용하여 전송할 때 가장 낮은 번호의 인터페이스가 사용됩니다.발신자의 주소 필드는 사용 된 첫 발신 인터페이스의 IP 주소로 설정됩니다.

첫 번째 발신 인터페이스는 ifconfig -a를 수행 할 때 순서로 정의됩니다.아마도 eth0 일 것입니다.

HTH.

건배, 롭

timbo 에서 제공하는 솔루션은 주소 범위가 고유하고 겹치지 않는다고 가정합니다.일반적으로 이러한 경우이지만 일반적인 솔루션은 아닙니다.

Steven의 책 "Unix network programming"(섹션 20.2)에서 제공 한대로 정확히 수행하는 함수의 뛰어난 구현이 있습니다. 이것은 recvfrom ()이 아닌 recvmsg ()를 기반으로하는 함수입니다.소켓에 IP_RECVIF 옵션이 활성화되어 있으면 recvmsg ()는 패킷이 수신 된 인터페이스의 인덱스를 반환합니다.그런 다음 목적지 주소를 조회하는 데 사용할 수 있습니다.

소스 코드는 여기 에서 확인할 수 있습니다.문제의 함수는 'recvfrom_flags ()'입니다.

안타깝게도 sendto 및 recvfrom API 호출은 로컬 IP 정보에 대한 필드가 없기 때문에 "모든 IP"에 바인딩 된 소켓과 함께 사용하면 근본적으로 중단됩니다.

그러면 어떻게 할 수 있습니까?

  1. 예를 들어 라우팅 테이블을 기준으로 추측 할 수 있습니다.
  2. 로컬 주소 목록을 가져 와서 각 로컬 주소에 별도의 소켓을 바인딩 할 수 있습니다.
  3. 이 정보를 지원하는 최신 API를 사용할 수 있습니다. 여기에는 두 부분이 있습니다. 먼저 관련 소켓 옵션 (IPv4의 경우 ip_recvif, IPv6의 경우 ipv6_recvif)을 사용하여이 정보를 원하는 스택에 알려야합니다. 그런 다음 다른 기능 (리눅스에서는 recvmsg 및 기타 여러 유닉스 계열 시스템, Windows에서는 WSArecvmsg)을 사용하여 패킷을 수신해야합니다.

    이 옵션 중 어느 것도 좋지 않습니다. 추측은 분명히 잘못된 답을 만들어 낼 것입니다. 별도의 소켓을 바인딩하면 소프트웨어의 복잡성이 증가하고 프로그램이 실행될 때 로컬 주소 목록이 변경되면 문제가 발생합니다. 최신 API는 올바른 기술적 솔루션이지만 이식성을 감소시킬 수 있으며 (특히 Windows XP에서 WSArecvmsg를 사용할 수없는 것처럼 보임) 사용중인 소켓 래퍼 라이브러리를 수정해야 할 수 있습니다.

    편집은 내가 틀린 것처럼 보이며 MS 문서가 오해의 소지가 있으며 WSArecvmsg를 Windows XP에서 사용할 수 있습니다. https://stackoverflow.com/a/37334943/5083516 참조

라코 디스

실제 코드 :

int nbytes = recvfrom(sock, buf, MAXBUFSIZE, MSG_WAITALL, (struct sockaddr *)&bindaddr, &addrlen);

fprintf(stdout, "Read %d bytes on local address %s\n", nbytes, inet_ntoa(bindaddr.sin_addr.s_addr));

도움이 되었기를 바랍니다.

해보기 : 라코 디스

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top