2016-11-08 109 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事件循環中時,它不能被觸發? –

相關問題