2014-09-08 2 views
1

다른 프로세스가 이미 지정된 포트에 바인딩되어있는 경우 QT5.2가 설치된 Windows에서 간단한 코드가 실패합니다. ShareAddress 플래그는 바인딩을 여러 번 허용해야합니다. MacOSX에서는 잘 작동합니다.ShareAddress가있는 멀티 캐스트 용 QUdpSocket 바인드가 실패합니다.

if (false == bind(QHostAddress::AnyIPv4, port_, QUdpSocket::ShareAddress)) 
{ 
    qDebug() << "Warn: cannot bind to the multicast port " << port_; 
    qDebug() << error(); 
} 
joinMulticastGroup(QHostAddress(address_)); 

QT의 버그입니까? 그렇다면 해결 방법이 있습니까?

감사합니다.

답변

2

documentation에 명시된대로 Windows 플랫폼에서는 ShareAddress이 무시됩니다.

다른 서비스가 동일한 주소 및 포트에 바인딩 할 수 있도록 허용합니다. 이는 여러 프로세스가 동일한 주소 및 포트를 수신하여 단일 서비스의로드를 공유 할 때 유용합니다 (예 : 몇 개의 미리 포착 된 수신기가있는 웹 서버가 응답 시간을 크게 향상시킬 수 있음). 그러나 모든 서비스가 다시 바인딩 될 수 있으므로이 옵션은 특정 보안 고려 사항의 적용을받습니다. 이 옵션을 ReuseAddressHint와 결합하면 서비스에서 기존 공유 주소를 리 바인드 할 수 있습니다. Unix에서는 SO_REUSEADDR 소켓 옵션과 동일합니다. Windows에서는이 옵션이 무시됩니다.

이 솔루션을 테스트 한 적이 없지만 제 생각에는 QUdpSocket::ReuseAddressHint을 Windows의 대체 플래그로 사용해 볼 수 있습니다.

+0

감사합니다. QUdpSocket :: ReuseAddressHint를 추가하면 Windows에서 정상적으로 작동합니다. –