2016-11-08 30 views
2

我读的文档中发送一个包与QTcpSocket我可以只使用write方法。 但是当我这样做时,我的服务器不会收到它。我需要拨打flushwaitForByteWritten发送。为什么QTcpSocket不写?我需要刷新它,使它发送我的数据

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)); 
} 

当我打电话write,它返回的字节适量。

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

+0

您能否提供指向您所指的文档的链接?你的总结听起来有几种不同的方式(例如,数据包是一个TCP实现的东西,与这个API无关),如果我能指出你正在查看的文档是什么,我认为我可以更好地澄清你的错误观念说。 (假设它是正确的,哪位....谁知道?) –

回答

6

QTcpSocket是一个缓冲设备,所以数据不是直接写入,而是写入内部缓冲区。 Documentation状态:

注:TCP套接字不能在QIODevice中::无缓冲模式中打开。

因此,您应该拨打flushwaitForBytesWritten以确保传送内容。

它们之间有区别。 flush尽可能从内部写入缓冲区写入底层网络套接字而不会阻止waitForBytesWritten,直到至少一个字节被写入插座并发出bytesWritten()信号。

+0

好吧,我以为这是因为我的写作工作不正常,readyRead从未被删除,但似乎并非如此...有你是一个想法,为什么它永远不会发射? –

+1

@DimitriDanilov'readyRead()'当新数据到达时发出,你确定你的服务器发送响应吗? – Nikita

+0

是的,我肯定,readyRead()只有当我发送我的缓冲区与waitForBytesWritten()emmited,但它阻止...当我刷新数据到我的服务器,但我没有得到他的回应,因为readyRead( )未被触发。也许当我在GUI事件循环中时,它不能被触发? –

相关问题