2017-12-05 1 views
0

QT 문제보다 UDP 구성 문제가 더 많이 발생한다고 말하는 것으로 시작하겠습니다.QT UDP 소켓 빈 데이터 그램을 반환 중

우분투 컴퓨터에서 UDP 재생을 사용하여 PCAP 파일을 Windows PC에 재생하고 있습니다. wireshark를 통해 UDP 데이터를 확인할 때 각 패킷 내의 모든 관련 데이터를 볼 수 있습니다. 그러나 QT 프로그램을 사용할 때 적절한 길이의 패킷을 가져 오지만 패킷 내에는 데이터가 없습니다. 단지 0입니다.

Windows PC의 IP 주소는 우분투 원본 PC와 동일한 서브넷에 있고 적절한 포트가 구성되어 있습니다.

여기, 본질적으로 QT 멀티 캐스트 수신기의 예를 사용하고 있습니다 : http://doc.qt.io/qt-5/qtnetwork-multicastreceiver-example.html

어떤 생각을?

편집 :

올바른 코드를 포함하지 않은 것에 대해 사과드립니다.

void Receiver::processPendingDatagrams() 
{ 
    while (udpSocket->hasPendingDatagrams()) { 
     QByteArray datagram; 
     datagram.resize(udpSocket->pendingDatagramSize()); 
     udpSocket->readDatagram(datagram.data(), datagram.size()); 
     statusLabel->setText(tr("Received datagram: \"%1\"") 
          .arg(datagram.data())); 
    } 
} 

datagram.data() 바이트 배열은 실제로 패킷에 포함 된 내용에 관계없이 간단히 0으로 채워집니다.

생각하십니까?

+0

왜 이것이 다운 voted 중인지 잘 모르겠습니다. 솔직히 여기서 도움이 필요해. 내가 할 수있는 한 좀 더 살피게하십시오. 수신 할 각 UDP 패킷의 길이는 1375 바이트입니다. 1375 바이트 데이터 그램을 수신하지만 내용은 모두 0입니다. – Stinger410

+1

나는 downvoter 아니지만 ... 관련 코드를 표시해야합니다 - 가급적이면 [mcve]. 그렇지 않으면 모두 추측입니다. –

+0

의견을 보내 주셔서 감사합니다. 질문을 업데이트했습니다. – Stinger410

답변

0

코드는 readDatagram에 의해 반환 된 수신 된 데이터 그램의 크기를 편리하게 무시합니다. 그것이 가능한 오류의 한 원인입니다. 상황이 대신 receiveDatagram를 사용하여 훨씬 쉽게 될 것입니다 :

void Receiver::processPendingDatagrams() 
{ 
    while (udpSocket->hasPendingDatagrams()) { 
    auto datagram = udpSocket->receiveDatagram(); 
    statusLabel->setText(tr("Received datagram: \"%1\"") 
         .arg(QString::fromLatin1(datagram.data().toHex()))); 
    } 
} 

이제 데이터 그램의 내용은-진수 인코딩하고 그것을 하고 그것이 얼마나 오래에있어 정확히 알 쉽습니다. 일반적으로 은 문자열 화되지 않은 데이터 그램의 내용을 문자열 출력 메소드의 인수로 전달하기 때문에 UTF-8 디코더 버그가 잠재적으로 악용 될 수 있습니다. 그로부터 보호하려면 toHex()을 사용하십시오. data()은 여기에서 char * data()이 아니고 QByteArray data()이 아니므로 정확히 수신 한 길이가 표시됩니다.

관련 문제