为什么QTcpSocket不写?我需要刷新它以使其发送我的数据

Dim*_*lov 3 c++ sockets qt

我在文档中读到要用QTcpSocket发送数据包我可以使用该write方法.但是当我这样做时,我的服务器没有收到它.我需要打电话flushwaitForByteWritten发送它.

TCPClient::TCPClient(Client *babel , const std::string &hostname, unsigned short port, QObject *parent) : QObject(parent), client(babel),  hostName(hostname), port(port), is_connected(false)
{
  this->tcpSocket = new QTcpSocket(this);
  connect(this->tcpSocket, SIGNAL(readyRead()),this, SLOT(readMessage()));
  connect(this->tcpSocket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(displayError(QAbstractSocket::SocketError)));
  connect(this->tcpSocket, SIGNAL(connected()), this, SLOT(connectReady()));
  connect(this->tcpSocket, SIGNAL(disconnected()), this, SLOT(disconnectedReady()));

}

TCPClient::~TCPClient()
{

}

bool TCPClient::initiateService()
{
  this->tcpSocket->connectToHost(this->hostName.c_str(), this->port);
  this->tcpSocket->waitForConnected(5000);
}

void TCPClient::connectReady()
{
  this->is_connected = true;
}

void TCPClient::disconnectedReady()
{

}


bool TCPClient::sendBabelPacket(Protocol::BabelPacket &packet)
{
  if(this->tcpSocket->state() == QAbstractSocket::ConnectedState && is_connected)
  {
    std::cout << "writing ... size : " << sizeof(Protocol::BabelPacket) + packet.dataLength<<std::endl;
    this->tcpSocket->write((const char *)&packet, sizeof(Protocol::BabelPacket) + packet.dataLength);
    //this->tcpSocket->flush();
    return true;
  }
  else
  {
    std::cout << "socket close" << std::endl;
    return false;
  }
}


void TCPClient::shutDown()
{
  this->tcpSocket->abort();
}

void TCPClient::displayError(QAbstractSocket::SocketError socketError)
{

}

void TCPClient::readMessage()
{
  char buffer[sizeof(Protocol::BabelPacket)];
  this->tcpSocket->read(buffer, sizeof(Protocol::BabelPacket));
}
Run Code Online (Sandbox Code Playgroud)

当我调用时write,它返回正确的字节数.

我在同一个线程中的GUI上下文中使用此类.

Nik*_*ita 9

QTcpSocket是一个缓冲设备,因此数据不是直接写入,而是写入内部缓冲区.文件说明:

注意:无法在QIODevice :: Unbuffered模式下打开TCP套接字.

因此,你应该打电话flushwaitForBytesWritten确保转移一些东西.

他们之间有区别.flush尽可能多地从内部写缓冲区写入底层网络套接字,而不会阻塞.waitForBytesWritten 阻塞,直到在套接字上写入至少一个字节并且bytesWritten()已发出信号.