Я пытаюсь использовать 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();
}
}
iniClient->bytesAvailable()
. Избавьтесь от этого. Используйте буфер данных фиксированного размера. Правильного использования этого метода очень мало, и это не один из них. - person user207421   schedule 28.03.2013