Qt5 QT 5.0 Qudpsocket不会触发WaitForBytesWrite
我绑定了一个udp套接字,正在尝试为特定地址编写udp数据报,因此下面是我的代码:Qt5 QT 5.0 Qudpsocket不会触发WaitForBytesWrite,qt5,qudpsocket,Qt5,Qudpsocket,我绑定了一个udp套接字,正在尝试为特定地址编写udp数据报,因此下面是我的代码: UDP::UDP(QObject *parent) : QObject(parent) { socket = new QUdpSocket(this); QObject::connect(socket,SIGNAL(bytesWritten(qint64)),this,SLOT(bytesWritten(qint64))); QObject::connect(socket,SIGN
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,但实际上我收到的字节被写入,并且字节写入信号被发出。那么,它为什么要加入if条款呢
psi将ip dest测试为127.0.0.1,在调用write之后,socket->errorString打印未知错误QAbstractSocket::WaitForBytesWrite用于TCP套接字 有了QUdpSocket,API就被写进了tagram,它至少在Qt级别立即发送,我想操作系统有一个缓冲区。要证明这一点,请参见src/network/socket/qudpsocket.cpp中writeDatagram的实现,它发出bytesWriteTensent
因此,在WriteTagram之后调用WaitForBytesWrited是没有意义的。您能分享更多的代码吗?socket->writeDatagram之前是什么?当然!已经发布了,当您运行代码时,难道您没有得到以下信息:QAbstractSocket::WaitForBytesWrite在未连接状态下是不允许的吗?