我正在嘗試使用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();
}
}
我應該補充說,被髮送的文件是一個ascii文本文件。正如TCP所預期的那樣,我正在逐行發送它,並且正在以不同的方式接收它。 – jhowland 2013-03-28 00:53:52
'iniClient-> bytesAvailable()'。擺脫這一點。使用固定大小的數據緩衝區。這種方法的正確使用很少,這不是其中之一。 – EJP 2013-03-28 09:04:06
你能解釋爲什麼bytesAvailable()在這裏不好用嗎?作爲複製TrollTech示例代碼的結果,我開始這樣做,並且沒有發現問題 - 我意識到這並不意味着沒有問題,但如果這是衆所周知的問題方法,我希望看到討論。我做了谷歌搜索,沒有立即解釋 – jhowland 2013-05-24 18:41:35