2012-11-06 13 views
0

我試圖比較TCP客戶端中到達的數據與QString。但我認爲,這是一種比較的形式。我的TCP客戶端是用C#編寫的Qt和TCP服務器。下面是的Qt的示例代碼我讀功能:我如何比較到達的Qt中的TCP/IP數據

void MyClient::slotReadyRead() 
{ 
    QString okStr = "OK!"; 
    ui->textEdit->append(okStr); 
    ui->textEdit->append("Reading..."); 
    QString str = socket->readAll(); 
    ui->textEdit->append(str); 
    if(str == okStr) 
     ui->textEdit->append("OK! is true"); 
    else 
     ui->textEdit->append("OK! is false"); 
} 

,這裏是寫C# - 服務器代碼的命令「OK!」:

private void WriteOutput(Commands cmd) 
{ 
    if (NS == null) 
     return; 

    string str = Enum.GetName(typeof(Commands), cmd); 
    StreamWriter writer = new StreamWriter(NS); 
    writer.WriteLine(str + "!"); 
    writer.Flush(); 
} 

在這種情況下,CMD將「OK」。在Qt-TCP客戶端,我收到以下消息: OK! 正在讀... 好!

好的!是假的 但我想有一個行!是真的 :)。我應該選擇哪種數據格式?

+0

如果您使用的是''來標記的應用級消息的末端,那麼你讀函數必須堅持讀書,直到它讀一個'!'。 TCP不會爲您執行應用程序級別的消息界限 - 您必須這樣做。 (或者您是否使用行來劃分應用程序級別的消息?我們無法從您的代碼中得知)請閱讀[我的答案](http://stackoverflow.com/a/11873691/721269)的最後兩段以[this](http://stackoverflow.com/questions/11873366/android-tcp-app-hanging-on-instream-readline)TCP問題。 –

+0

我使用'\ n'來分隔應用程序級別的消息。這裏是writeline-function的描述:http://msdn.microsoft.com/en-au/library/system.io.streamwriter.writeline –

+0

那麼爲什麼你不從套接字讀取,直到你得到一個換行符? –

回答

0

我解決了它。問題是,在Windows中,新行不是'\ n',而是'\ r \ n'。因此,如果我將Windows上的QString "OK!\n"與到達的TCP數據「OK!\ r \ n」進行比較,那麼我總是會得到「false」。一種解決方案是將我的QString "OK!\r\n"與到達的TCP數據「OK!\ r \ n」進行比較,或者第二種解決方案是僅分割第一個「OK!」。與Qt的命令QString kurzstr = str.section("\r\n", 0, 0);這裏的數據部分代碼:

QString okStr = "OK!"; 
QString str = socket->readLine(); 
QString kurzstr = str.section("\r\n", 0, 0); 
    if(okStr == kurzstr) 
     ui->textEdit->append("OK! is true"); 
    else 
     ui->textEdit->append("OK! is false");