我使用QUdpSocket是为了从服务器接收数据。当我使用SFML接收数据时,我可以通过SocketUdp接收数据,但使用qt则不起作用。
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;
}发布于 2012-12-08 09:51:01
我会在绑定前进行连接。在绑定之后,readyRead可能会在连接调用完成之前触发。如果不清空挂起的数据报,readyRead将不会再次触发。
发布于 2013-11-24 23:48:07
为了将信号(readyRead())连接到任何插槽,QUdpSocket必须位于QAbstractSocket::状态中。尽管在连接之前调用了bind,但QUdpSocket上的bind会进行非阻塞调用,这意味着绑定可能会延迟。要确保在绑定完成且QUdpSocket处于绑定状态后将信号(readyRead())连接到插槽(QtReceive()),请执行以下操作:
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()));
}
}https://stackoverflow.com/questions/13773374
复制相似问题