2012-10-18 2 views
3

잘 알려진 포트에 바인딩하고 멀티 캐스트 그룹에 자신을 추가하고 클라이언트에 대한 요청을 수신하는 UDP 서버가 있습니다. (서버가 Windows에 있고 WSARecvFrom을 사용하여 클라이언트 데이터 그램에 대해 중복 수신을 실행합니다.) 클라이언트는 잘 알려진 포트와 멀티 캐스트 IP 주소로 서버에 메시지를 보냅니다.UDP 멀티 캐스트 수신 실패 수신 수신

랩톱에서 '서버'를 테스트 할 때 랩톱이 '휴면'상태가되면 서버의 수신 소켓이 멀티 캐스트 주소에서 '언 바운드'됩니다 (클라이언트가 멀티 캐스트 주소로 보내지 않도록 - 더 길게 받았다. 그러나 소켓은 127.0.0.1에있는 포트로의 전송이 여전히 수신된다는 점에서 여전히 수신 중이며 Windows는 오류를 표시하지 않습니다. (서버 소켓은 INADDR_ANY에 바인딩됩니다.)

'서버'는 자동 검색에 사용되는 피어 - 투 - 피어 응용 프로그램의 일부이므로 예상대로이 상황이 비정상적이지는 않습니다.

멀티 캐스트 주소로 전송하지 않고도 서버가 멀티 캐스트 주소를 적극적으로 수신하고 있는지 확인할 방법을 제안 할 수 있습니까? (네트워크의 모든 '서버'로 불필요한 트래픽을 유발할 수 있습니다)? 한 가지 가능한 솔루션은 멀티 캐스트에 사용되는 어댑터의 IP 주소로 보내는 것이지만이를 결정하는 방법을 모르겠습니다.

답변

7

네트워크 스택은 주기적으로 IGMP 개의 메시지를 보냅니다. 네트워크상의 스위치는 IGMP snooping을 사용하여 컴퓨터에 필요한 멀티 캐스트 메시지 (있는 경우)를 확인할 수 있습니다. (이것은 요청하지 않은 트래픽으로 인해 호스트에 과도한 부하가 걸리는 것을 방지하기위한 시도입니다.)

랩톱이 잠자기 상태가되면 특정 멀티 캐스트 트래픽에 관심이 있음을 확인하는주기적인 메시지를 보내는 것을 중지합니다. 스위치가이를 감지하고 랩톱으로 트래픽을 보내지 않습니다.

노트북을 최대 절전 모드에서 다시 시작하고 멀티 캐스트 그룹에 구성원을 다시 추가해야 할 때가 있습니다. 제어 코드 SIO_ADDRESS_LIST_CHANGE을 사용하여 WSAIoctl을 호출하여이 작업을 수행했습니다 (네트워크 어댑터에 대한 대처는 활성화/비활성화 됨). 랩톱이 잠자기 될 때마다 모든 어댑터가 사용 불능으로보고됩니다. 다시 시작되면 어댑터가 다시 사용 가능한 것으로보고됩니다. (어댑터가 실제로 UDP 데이터 그램을 전송할 수 있기 전에 몇 초 안에 어댑터가 사용 가능한 것으로보고 될 수 있으므로 각 재시도 사이에 약간의 지연을 두어 멤버쉽을 몇 번 추가해야 할 수도 있습니다. 원하는 경우 어댑터 변경 사항을 통보받은 후 30 초 정도 기다릴 수 있습니다.)

+0

마침내이 기능을 구현했으며 (다른 우선 순위에 비해 지연됨) 잘 작동합니다. 다시 한 번 감사드립니다. –