2013-03-28 128 views
0

我正在嘗試使用TCP服務器並使用QTcpSocket客戶端連接到它。大多數情況下,服務器和客戶端恰好在同一臺機器上,但這不是必需的。我想要做的是將文件從正在運行的多線程進程轉移到想要共享服務器和客戶端使用的信息的GUI。TCP套接字通信正在損壞

連接等似乎很好。實際上,代碼似乎長時間工作得很好,但現在我已經在不同的硬件上運行了它,而在Ubuntu 12.04而不是10.04上,偶爾會在接收的代碼中獲取嵌入的雜散字節 - 通常(但不是總是)空值。我無法弄清楚什麼是錯的,並歡迎任何建議。

這裏是讀取我的文件,併發送該字節到連接的客戶機的服務器的一部分:

int fileSize; 
       printf(" about to open the file\n"); 
       ini_fd = fopen (rov_ini_file_name, "r"); 

       if(!ini_fd){ 
        break; 
       } 
       fseek(ini_fd,0,SEEK_END); 
       fileSize = ftell(ini_fd); 
       fseek(ini_fd,0,SEEK_SET); 
       int totalBytesSent =0; 
       int line = 0; 
       int len; 
       while (!feof (ini_fd)) 
        { 
        ch = fgets (&(my_line[0]), MAX_CHARACTER_COUNT - 1, ini_fd); 
        if (ch){ 
         len = strlen(&(my_line[0])); 
         bytes_sent = sendto(tio.my_tio_port_table_entry.to_sock, 
         &(my_line[0]), 
         len, 
         0, 
         (struct sockaddr *) (&(tio.my_tio_port_table_entry.ToAddr)), 
         sizeof (tio.my_tio_port_table_entry.ToAddr)); 
         totalBytesSent += bytes_sent; 
         line++; 
         //printf(" line %d bytes sent = %d total bytes = %d\n",line,bytes_sent,totalBytesSent); 
        } 
       } 
       len = sprintf(&(my_line[0]),"END_OF_INI_FILE"); 
       bytes_sent = sendto(tio.my_tio_port_table_entry.to_sock, 
         &(my_line[0]), 
         len, 
         0, 
         (struct sockaddr *) (&(tio.my_tio_port_table_entry.ToAddr)), 
         sizeof (tio.my_tio_port_table_entry.ToAddr)); 

       tio.my_tio_port_table_entry.connected = FALSE; 
       break; 

這裏就是我讀正在發送的數據。這是連接到readyRead信號

void AlvGUI::readIniFromServer() 
{ 

    QByteArray inArray(iniClient->bytesAvailable(),0); 

    if(!iniStarted) 
    { 
     tempIniFile = new QTemporaryFile; 
     if(tempIniFile->open()) 
     { 
      iniStarted = true; 
     } 
     else 
     { 
      // error should be here! 
     } 

    } 


    int bytesRead = iniClient->read(inArray.data(),inArray.size()); 
    int endLoc = inArray.lastIndexOf("END_OF_INI_FILE"); 
    if(-1 != endLoc) 
    { 
     inArray.chop(endLoc); 
     bytesRead = endLoc; 
     iniFinished = true; 
    } 
    tempIniFile->write(inArray.data(),bytesRead); 
    if(iniFinished) 
    { 
     tempIniFile->flush(); 
     tempIniFile->close(); 
     iniFile.close_ini(); 
     char *theTempFile = strdup((char *)tempIniFile->fileName().toAscii().data()); 
     iniFile.open_ini(theTempFile); 
     gotIni = true; 
     iniRequestTimer->stop(); 
     makeGui(); 
     free(theTempFile); 
     hotelSetup = true; 
     iniClient->abort(); 
    } 
} 
+0

我應該補充說,被髮送的文件是一個ascii文本文件。正如TCP所預期的那樣,我正在逐行發送它,並且正在以不同的方式接收它。 – jhowland 2013-03-28 00:53:52

+0

'iniClient-> bytesAvailable()'。擺脫這一點。使用固定大小的數據緩衝區。這種方法的正確使用很少,這不是其中之一。 – EJP 2013-03-28 09:04:06

+0

你能解釋爲什麼bytesAvailable()在這裏不好用嗎?作爲複製TrollTech示例代碼的結果,我開始這樣做,並且沒有發現問題 - 我意識到這並不意味着沒有問題,但如果這是衆所周知的問題方法,我希望看到討論。我做了谷歌搜索,沒有立即解釋 – jhowland 2013-05-24 18:41:35

回答

0

像往常一樣插槽,問一個問題讓我挖更深。我沒有tcp服務器問題 - 我確認通過使用telnet連接到我的服務器,然後將輸出重定向到一個文件 - 這是完美的

所以我深入瞭解我的代碼,而不是截斷保存在QtByteArray中的傳入數據,我正在對它進行斬波 - 從QtByteArray的末尾讀取字節數。除了當我使用QtByteArray的data()成員函數時,我只是返回了一個char指針,因此可以訪問所有數據。數據已損壞,我已經完成的章()