2013-10-23 93 views
0

我向系统发送命令并从中读取响应。我的机器是客户机,我成功地向服务器写入了一个数据包,但是,我无法收到来自它的响应。我很奇怪,为什么出现这种情况,请看看我的代码:(服务器地址为192.168.100.143,端口为11000)无法从QUdpSocket客户端读取

void UDP::UDPInit(int port) 
{ 
    socketPort = port; 

    udpsocket = new QUdpSocket(this); 
} 


void UDP::sendCommand(QByteArray data) 
{ 
    QHostAddress *host = new QHostAddress("192.168.100.143"); 
    quint16 port = 11000; 
    if(udpsocket->writeDatagram(data.data(),QHostAddress(ip),socketPort)==-1) 
     emit clientLogMessage(QString("UDPCLIENT : Write problem !")); 
    else 
     udpsocket->flush(); 

    while (!udpsocket->hasPendingDatagrams()) { 
     QByteArray datagram; 
     datagram.resize(udpsocket->pendingDatagramSize()); 
     qDebug() << udpsocket->pendingDatagramSize(); 
     udpsocket->readDatagram(datagram.data(), datagram.size(), host, &port); 
     emit dataReceived(datagram); 
    } 
} 
+0

如果你在一个事件循环中,那么只需连接到udpsocket的'readyRead()'信号而不是循环 –

+0

我可以问一下这个区别吗? – Sam

+0

返回到偶数循环,不处理我在循环中看到的错误 –

回答

2

QUdpSocket提供具有被每一次新的数据包可发射的信号readyRead ,如果你是在一个事件循环,我建议你使用它

的情况在你同时被否定,这意味着udpsocket->pendingDatagramSize()将返回-1 while循环内,readDatagram将丢弃该数据包

固定码:

void UDP::UDPInit(int port) 
{ 
    socketPort = port; 

    udpsocket = new QUdpSocket(this); 
    connect(udpsocket, SIGNAL(readyRead()), this, SLOT(readSocket())); 
} 


void UDP::sendCommand(QByteArray data) 
{ 
    QHostAddress *host = new QHostAddress("192.168.100.143"); 
    quint16 port = 11000; 
    if(udpsocket->writeDatagram(data.data(),QHostAddress(ip),socketPort)==-1) 
     emit clientLogMessage(QString("UDPCLIENT : Write problem !")); 
    else 
     udpsocket->flush(); 

} 

void UDP::readSocket() 
{ 
    while (udpsocket->hasPendingDatagrams()) 
    { 
     QByteArray datagram; 
     datagram.resize(udpsocket->pendingDatagramSize()); 
     qDebug() << udpsocket->pendingDatagramSize(); 
     udpsocket->readDatagram(datagram.data(), datagram.size(), host, &port); 
     emit dataReceived(datagram); 
    } 
} 
+0

谢谢你的纠正。但是,我仍然不明白使用信号和简单的while循环之间的区别。在这里显然都做同样的事情。 – Sam

+1

没有while循环从来没有真正的等待,直到某些东西能够读取,除非你做了'waitForReadyRead',但是然后你阻塞了事件线程并且没有其他东西可以在它上面完成 –

+0

是否有必要在这个程序中调用bind()?一位同事建议这可能是由于忽略bind(),如果我这样做,我不能从服务器读取,但我可以成功写入它。 – Sam

相关问题