Связь через сокет TCP нарушена

Я пытаюсь использовать TCP-сервер и подключиться к нему с помощью клиента QTcpSocket. В большинстве случаев сервер и клиент находятся на одной машине, но это не является обязательным требованием. Я пытаюсь передать файл из запущенного многопоточного процесса в графический интерфейс, который хочет поделиться информацией, используемой как сервером, так и клиентом.

Подключение и т. Д. Вроде как в порядке. Фактически, код казался отлично работающим долгое время, но теперь, когда я запускаю его на другом оборудовании и на 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();
    }
}

person jhowland    schedule 28.03.2013    source источник
comment
Я должен добавить, что отправляемый файл является текстовым файлом ascii. Как и следовало ожидать от TCP, я отправляю его построчно, и он принимается разными частями.   -  person jhowland    schedule 28.03.2013
comment
iniClient->bytesAvailable(). Избавьтесь от этого. Используйте буфер данных фиксированного размера. Правильного использования этого метода очень мало, и это не один из них.   -  person user207421    schedule 28.03.2013
comment
Вы можете объяснить, почему здесь нельзя использовать bytesAvailable ()? Я начал делать это в результате копирования кода примера TrollTech и не обнаружил проблем - я понимаю, что это не значит, что проблем нет, но если это хорошо известный проблемный подход, я бы хотел увидеть обсуждение. Я выполнил поиск в Google без немедленных объяснений   -  person jhowland    schedule 24.05.2013


Ответы (1)


Как обычно, вопрос заставляет копать еще глубже. У меня не было проблемы с tcp-сервером - я подтвердил это, используя telnet для подключения к моему серверу, а затем перенаправил вывод в файл - что было безупречно.

поэтому я углубился в свой код и вместо того, чтобы обрезать входящие данные, которые хранились в QtByteArray, я разрезал их, что отняло количество байтов, считанных с конца QtByteArray. За исключением того, что когда я использовал функцию-член data () QtByteArray, я только что получил обратно указатель char и, таким образом, получил доступ ко всем данным. Данные были повреждены там, где я сделал отбивку ()

person jhowland    schedule 28.03.2013