2013-03-14 37 views
0

我已绑定一个UDP套接字,我试图写一个特定ADRESS所以这里一个UDP数据报是我的代码:QT 5.0 QUdpSocket提供不会触发waitforbyteswritten

UDP::UDP(QObject *parent) : 
    QObject(parent) 
{ 
    socket = new QUdpSocket(this); 
    QObject::connect(socket,SIGNAL(bytesWritten(qint64)),this,SLOT(bytesWritten(qint64))); 
    QObject::connect(socket,SIGNAL(readyRead()),this,SLOT(readyRead())); 
} 
void UDP::connect(int port){ 

if(socket->state()==QAbstractSocket::BoundState){ 
    qDebug()<<"already bound try to disconnect"; 
    socket->close(); 
} 
    if(socket->bind(QHostAddress::Any,port,QAbstractSocket::ShareAddress|QAbstractSocket::Reuse AddressHint)){ 
     qDebug()<< "listening"; 
     emit changeStatus("UDP: escutando("+QString::number(port)+")"); 
    }else{ 
     qDebug()<< "error no bind"; 
     emit changeStatus("UDP: erro no bind("+QString::number(port)+")"); 
    } 
} 

void UDP::bytesWritten(qint64 bytes){ 
    qDebug()<<"bytes written:"<<bytes; 
    emit changeStatus("UDP: enviado"); 
} 

void UDP::readyRead(){ 
    qDebug()<<"ready to read"; 
    QByteArray datagram; 
    QHostAddress sender; 
    quint16 senderPort; 

    datagram.resize(socket->pendingDatagramSize()); 
    socket->readDatagram(datagram.data(),datagram.size(),&sender,&senderPort); 
    qDebug()<< "datagram received from " << sender.toString(); 

    emit receivedUDPdata(datagram); 

} 
bool UDP::write(QString dest,int port, QString buffer, int size){ 
    char *finalOutput; 
    finalOutput = new char[size]; 
    unsigned int j=0; 

    for(unsigned int i=0;i<size;i++){ 
     if(buffer[i]== '\\'){ 
      switch (buffer.at(++i).toLatin1()){ 
      case 'r': 
       finalOutput[j++] = '\r'; 
       break; 
      case 'n': 
       finalOutput[j++]= '\n'; 
       break; 
      case 't': 
       finalOutput[j++]='\t'; 
       break; 
      case '\\': 
       finalOutput[j++]='\\'; 
       break; 
      } 
     }else{ 
      finalOutput[j++]= buffer[i].toLatin1(); 
     } 
    } 
    socket->writeDatagram(finalOutput,j,QHostAddress(dest),port); 
    if(!socket->waitForBytesWritten(2000)){ 
     qDebug() << "UDP Couldnt write."; 
     emit changeStatus("UDP: Não foi possível escrever"); 
     return false; 
    } 
    return true; 
} 

变量dest为QString的,但在我调用socket-> writeDatagram它进入如果下面如果它失败,但实际上字节被写入(我接收)然后发送字节写入的信号。那么为什么它要进入if子句呢?

PS(我测试的IP DEST如127.0.0.1)和插座 - > Errorstring,则()打印 “未知错误”

+0

你能分享更多的代码吗? 'socket-> writeDatagram()'之前有什么? – dschulz 2013-03-15 00:00:01

+0

当然!已经发布了它 – user1553386 2013-03-15 16:44:43

+0

当你运行你的代码时,你不会得到以下内容:UnconnectedState中不允许使用QAbstractSocket :: waitForBytesWritten()吗? – 2013-11-26 23:32:05

回答

0

QAbstractSocket :: waitForBytesWritten()是用于TCP套接字,调用写入之后()。

对于QUdpSocket,API是writeDatagram(),它立即发送(至少在Qt级别,操作系统有一个缓冲区,我想)。为了证明这一点,请参阅src/network/socket/qudpsocket.cpp中writeDatagram()的实现,它会发出bytesWritten(已发送);

因此,在writeDatagram()之后调用waitForBytesWritten()没有意义。