2013-03-28 4 views
0

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

Соедините, etc, кажется, все в порядке. Фактически, код работал отлично в течение длительного времени, но теперь, когда я запускаю его на другом оборудовании, а на Ubuntu 12.04 вместо 10.04, я иногда получаю встроенные байты в полученном коде - обычно (но не всегда) nulls. Я не могу понять, что случилось, и будет приветствовать любой совет.

Вот часть сервера, который читает мой файл и посылает байты подключенного клиента:

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

+0

'iniClient-> bytesAvailable()'. Избавься от этого. Используйте буфер данных фиксированного размера. Правильного использования этого метода очень мало, и это не один из них. – EJP

+0

вы можете объяснить, почему bytesAvailable() плохо использовать здесь? Я начал делать это в результате копирования кода примера TrollTech и не нашел проблем - я понимаю, что это не значит, что проблем нет, но если это хорошо известный проблематичный подход, я бы хотел увидеть обсуждение. Я сделал поиск в Google без немедленных объяснений – jhowland

ответ

0

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

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

Смежные вопросы