【发布时间】:2011-09-28 02:26:39
【问题描述】:
我正在尝试编写一个小型 UDP 服务器应用程序。
我有一个客户端传输到这个应用程序套接字,我已经使用一个小型 UDP 回显程序(它将端口上接收到的数据回显到屏幕)验证了这发送正常,而且,我可以看到在 wireshark 中接收到的数据包.
我正在使用 QUdpSocket,它似乎在设置时绑定正常 - 但 readyRead() 信号似乎从未被触发。
我在下面包含了我的一些代码 - 目前我只是试图模拟小回声程序。
只是为以下代码提供一些上下文 - 在 UI 上按下按钮会调用在 UI 上键入的端口上的“setupNewSocket”。
#include "sockethandler.h"
SocketHandler::SocketHandler(QObject *parent) :
QObject(parent)
{
udpSocket = new QUdpSocket(this);
connect( &w, SIGNAL(openNewUDPSocket(quint16)), this, SLOT(setupNewSocket(quint16)) );
connect( this, SIGNAL(printOnUI(QString,QString,QString)), &w, SLOT(updateUI(QString,QString,QString)) );
w.show();
}
void SocketHandler::readPendingDatagrams()
{
while (udpSocket->hasPendingDatagrams())
{
QByteArray datagram;
datagram.resize(udpSocket->pendingDatagramSize());
QHostAddress sender;
quint16 senderPort;
udpSocket->readDatagram(datagram.data(), datagram.size(), &sender, &senderPort);
QString data = QString( datagram.data() );
QString sender_address = sender.toString();
QString sender_port = QString("%1").arg(senderPort);
emit printOnUI(data, sender_address, sender_port);
}
}
void SocketHandler::setupNewSocket(quint16 port)
{
if( udpSocket->bind(QHostAddress::LocalHost, port) )
{
connect(udpSocket, SIGNAL(readyRead()), this, SLOT(readPendingDatagrams()));
}
else
{
// bind has failed
}
}
【问题讨论】:
标签: qt networking udp