2013-03-28 103 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指针,因此可以访问所有数据。数据已损坏,我已经完成的章()