TCP 套接字通信被破坏
Posted
技术标签:
【中文标题】TCP 套接字通信被破坏【英文标题】:TCP socket communications are being corrupted 【发布时间】:2013-03-28 00:46:58 【问题描述】:我正在尝试使用 TCP 服务器并通过 QTcpSocket 客户端连接到它。大多数时候,服务器和客户端碰巧在同一台机器上,但这不是必需的。我要做的是将文件从正在运行的多线程进程传输到希望共享服务器和客户端使用的信息的 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();
【问题讨论】:
我应该补充一点,正在发送的文件是一个 ascii 文本文件。正如 TCP 所期望的那样,我逐行发送它,并且它以不同的块状接收。iniClient->bytesAvailable()
。摆脱这个。使用固定大小的数据缓冲区。这种方法的正确使用很少,这不是其中之一。
你能解释一下为什么 bytesAvailable() 在这里不好用吗?由于复制 TrollTech 示例代码,我开始这样做,但没有发现问题——我意识到这并不意味着没有问题,但如果这是一种众所周知的有问题的方法,我想看看讨论。我做了谷歌搜索,没有立即解释
【参考方案1】:
像往常一样,提出问题会让我更深入地挖掘。我没有 tcp 服务器问题——我通过使用 telnet 连接到我的服务器然后将输出重定向到一个文件来确认这一点——这是完美的
所以我更深入地研究了我的代码,而不是截断保存在 QtByteArray 中的传入数据,而是截断它——这将读取 QtByteArray 末尾的字节数。除了当我使用 QtByteArray 的 data() 成员函数时,我只是得到了一个 char 指针,因此可以访问所有数据。数据在我做chop()的地方被破坏了
【讨论】:
以上是关于TCP 套接字通信被破坏的主要内容,如果未能解决你的问题,请参考以下文章