Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt TCP套接字通信已损坏_Qt_Tcp_Qtcpsocket - Fatal编程技术网

Qt TCP套接字通信已损坏

Qt TCP套接字通信已损坏,qt,tcp,qtcpsocket,Qt,Tcp,Qtcpsocket,我正在尝试使用TCP服务器并通过QTcpSocket客户端连接到它。大多数情况下,服务器和客户机恰好位于同一台机器上,但这不是必需的。我试图做的是将一个文件从一个正在运行的多线程进程传输到一个GUI,该GUI希望共享服务器和客户端使用的信息 连接等似乎很好。事实上,代码在很长一段时间内似乎工作得很好,但现在我在不同的硬件上运行它,在Ubuntu 12.04而不是10.04上,我偶尔会在收到的代码中嵌入零散字节——通常(但不总是)为空。我不知道出了什么问题,我欢迎任何建议 以下是服务器的一部分,用

我正在尝试使用TCP服务器并通过QTcpSocket客户端连接到它。大多数情况下,服务器和客户机恰好位于同一台机器上,但这不是必需的。我试图做的是将一个文件从一个正在运行的多线程进程传输到一个GUI,该GUI希望共享服务器和客户端使用的信息

连接等似乎很好。事实上,代码在很长一段时间内似乎工作得很好,但现在我在不同的硬件上运行它,在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();
    }
}

像往常一样,问一个问题让我挖掘得更深。我没有tcp服务器问题——我通过使用telnet连接到我的服务器并将输出重定向到一个文件来确认这一点——这是完美的


因此,我深入研究了我的代码,并没有截断保存在QtByteArray中的传入数据,而是对其进行了截断——这将读取QtByteArray末尾的字节数。除了当我使用QtByteArray的data()成员函数时,我只得到了一个char指针,因此可以访问所有数据。数据在我执行chop()时已损坏。

我应该补充一点,发送的文件是ascii文本文件。正如TCP所期望的那样,我将一行一行地发送它,并以不同的块度接收它。
iniClient->bytesAvailable()
。把这个扔掉。使用固定大小的数据缓冲区。这个方法的正确用法很少,而这不是其中之一。你能解释一下为什么在这里使用bytesAvailable()不好吗?我开始这样做是因为复制了TrollTech示例代码,但没有发现问题——我意识到这并不意味着没有问题,但如果这是一种众所周知的有问题的方法,我希望看到讨论。我在谷歌上搜索过,没有立即解释