2012-12-08 102 views
3

我正在使用QUdpSocket以接收來自服務器的數據。當我使用SFML接收數據時,我可以通過SocketUdp接收數據,但是使用qt它不起作用。QUdpSocket:無法接收數據報

void TheClass::Bind() 
{ 
    m_sock_receive = new QUdpSocket(this); 
    if (m_sock_receive->bind(QHostAddress::Any, port)) 
    { 
    std::cout << "Bind: OK" << std::endl; 
    connect(m_sock_receive, SIGNAL(readyRead()), this, SLOT(QtReceive())); 
    } 
    else 
     std::cout << "Bind: NOK" << std::endl; 
} 

void TheClass::QtReceive() 
{ 
    std::cout << "Pending data !" << std::endl; 
} 

回答

2

我會在綁定之前進行連接。在綁定之後,readyRead可能會在connect調用完成之前觸發。如果您不清空掛起的數據報,readyRead將不會再次觸發。

2

爲了將SIGNAL(readyRead())連接到任何插槽,QUdpSocket必須位於QAbstractSocket :: BoundState中。雖然在連接之前調用綁定,但QUdpSocket上的綁定會進行非阻塞調用,也就是說綁定可能會延遲。爲了確保你的信號(readyRead())連接到SLOT(QtReceive())綁定已完成,QUdpSocket提供處於綁定狀態後,執行以下操作:

void TheClass::Bind() 
{ 
    m_sock_receive = new QUdpSocket(this); 
    connect(m_sock_receive, SIGNAL(stateChanged(QAbstractSocket::SocketState)), 
     this, SLOT(onSocketStateChange(QAbstractSocket::SocketState))); 
    if (m_sock_receive->bind(QHostAddress::Any, port)) 
    { 
    std::cout << "Bind: OK" << std::endl; 
    } 
    else 
     std::cout << "Bind: NOK" << std::endl; 
} 

void TheClass::QtReceive() 
{ 
    std::cout << "Pending data !" << std::endl; 
} 

void TheClass::onSocketStateChange (QAbstractSocket::SocketState state) { 
    if (state == QAbstractSocket::BoundState) { 
     connect(m_sock_receive, SIGNAL(readyRead()), this, SLOT(QtReceive())); 
    } 
} 
+0

閱讀QT 4.8.6源代碼如果成功,我會看到BoundState立即在bind()函數中設置。請親自看看:https://github.com/qt/qt/blob/4.8/src/network/socket/qudpsocket.cpp#L265 –