2009-09-09 5 views
0

저는 현재 작업하고있는 응용 프로그램의 DNS 서버를 작성하고 있습니다. 몇 가지 어려움이 있습니다.QUdpSocket을 사용하는 Qt4 DNS 서버

localhost의 포트 53에 바인딩하고 DNS 조회 요청을 수신 한 다음 응답을 다시 보내려고합니다. 불행히도, 내가 QUdpSocket :: bind()를 호출하면 결과 소켓은 쓰기 가능하지 않다. 데이터를 다시 전송할 수 있도록하기 위해 전달해야하는 깃발이 있습니까? 쓰기가 거짓으로 확신하는,

답변

0

먼저 .. 연결이 수립 된 후

socket = new QUdpSocket(); 
connect(socket, SIGNAL(readyRead()), this, SLOT(onReadyRead()), Qt::DirectConnection); 
socket->bind(QHostAddress::LocalHost, 53, QUdpSocket::ShareAddress); 

은 나중에, 나는 :: QUdpSocket 중 하나를 호출 * 방법을 쓰고 싶어하지만 작동하지 않습니다 QHostAddress::Lockhost에 바인딩 하시겠습니까? 이것이 공용 네트워크에서 보이지 않는다는 것을 알고 있습니까? 같은 물리적 상자에있는 응용 프로그램에서만 볼 수 있습니다.

둘째, QUdpSocket::bind 호출에서 반환 매개 변수를 확인하지 않으므로 실제로 바인드 호출이 성공했는지 여부를 알 수 없습니다.

셋째, QUdpSocket::ShareAddress 힌트없이 시도해 보셨습니까? Qt documentation for BindMode enum는 비밀스럽게 ShareAddress에 대한 상태 : 그러나

, 어떤 서비스가 바인딩 할 수 때문에,이 옵션은 특정 보안 고려 될 수 있습니다.

이러한 보안 고려 사항은 무엇인지 모르겠지만 시도해 볼 항목 중 하나는 코드를 단순화하는 것입니다.

마지막으로 문제는 onReadyRead() 슬롯 내부의 코드입니까? 해당 코드를 게시하면 문제를 진단하는 데 도움이 될 수 있습니다.

+1

예,이 경우 LocalHost에 바인딩하는 것이 좋습니다. 붙여 넣은 코드는 문제를 재현 할 수있는 코드의 최단 거리이므로 오류 검사는 포함되지 않았습니다. 나는 그 정보를 미래에 포함시킬 것이다. 이전에 물어 본 다른 질문에서 사용한 것과 같은 방법으로 상황을 해결할 수있었습니다. http://stackoverflow.com/questions/1392494/qt4-dns-proxy-qudpsocket 감사합니다. – Michael

0

실행중인 플랫폼은 무엇입니까?

리눅스는 일반 사용자가 보안상의 이유로 1024 이하를 바인드하는 것을 허용하지 않는다고 생각합니다.