제가 이해한 바에 따르면, 소켓이 로컬 주소에 바인딩되지 않은(또는 바인딩된 INADDR_ANY
) 경우 원격 주소/포트 설정을 호출하지 않거나connect()
- 인터페이스가 하나인 컴퓨터에서 기본 IP 주소는 IP_ADDR입니다.
- 소켓 A는 UDP 멀티캐스트 주소 MULTICAST_IP_A를 수신하며 포트 번호는 PORT_A입니다.
- 소켓 B는 PORT_B에서 UDP 유니캐스트를 수신합니다.
그러면 다음 진술이 맞나요?
- 그룹 주소 MULTICAST_IP_A(포트 번호 PORT_B)로 전송된 멀티캐스트 패킷은 소켓 B로 전달됩니다.
- IP_ADDR:PORT_A로 전송된 유니캐스트 패킷은 소켓 A로 전달됩니다.
Linux IPv4 소스 코드를 살펴본 결과 지금까지 위의 두 가지 시나리오가 발생하는 것 같습니다. 예를 들면 다음과 같습니다.__udp_is_mcast_sock()
true
비어 있어도 반환됩니다 inet->mc_list
.inet_create()
inet->mc_all
하지만 저는 전문가 가 1
아니며 누군가가 이러한 주장을 확인/무효화하고 일부 코드 포인터를 제공하는 것을 듣고 싶습니다. 감사해요!
답변1
로컬 주소가 멀티캐스트가 아닌 경우 udp_is_mcast_sock()는 false를 반환합니다(참조).ip_mc_sf_allow).
두 질문 모두에 대해 이 기사가 도움이 될 수 있습니다.멀티캐스트(UDP) 소켓을 바인딩한다는 것은 무엇을 의미합니까?
사례 1의 경우.
- 멀티캐스트 패킷은 그룹 주소 MULTICAST_IP_A로 전송되며 포트 번호는 PORT_B입니다.~하지 않을 것이다소켓 B로 전송됨
사례 2의 경우.
- IP_ADDR:PORT_A로 전송된 유니캐스트 패킷~ 할 것이다소켓 A로 전달됩니다. UDP 멀티캐스트 소켓은 0.0.0.0에 바인딩됩니다. 이것이 바로 그 이유입니다.
netstat -aun
이미 포트 5353(avahi/mdns)에 서버가 있을 수도 있지만 서버를 가동하여 확인할 수 있습니다 .
Python 멀티캐스트 클라이언트/서버 프로그램을 사용하여 이 사례와 다른 사례를 확인할 수 있습니다.이 게시물. 유니캐스트 클라이언트/서버 동작을 시뮬레이션하려면 nc
(netcat)을 사용할 수 있습니다 .