0

我正在编写一个网络代理,它与可以翻译为 ASCII 文本的网页配合得很好。但是,当我尝试查看包含二进制数据的页面(Youtube.com 是我一直在使用的页面)时,某个地方出现了内存泄漏,并且相同的几个字符会在我的字符串末尾一遍又一遍地重复'正在发送给客户(并且会出现在他们显然不应该出现的其他地方)。

以下是我的代码的相关部分。SendHTTPResponse 是一个使用代理将网页的响应发送给客户端的函数,并且可以正常工作。

有没有人有任何见解?

int numBytes;  
char temp[3000];
memset(temp, '\0', 3000);  
numBytes = Read(internetSocket, temp, 2999);  
while (errno = 0, numBytes > 0 || errno == EINTR)
{
  SendHTTPResponse(socket, temp, numBytes);
  memset(temp, '\0', 3000);
  numBytes = Read(internetSocket, temp, 2999);     
}
4

2 回答 2

1

要回答您的问题,此代码中没有内存泄漏。

也没有理由认为内存泄漏与此问题有关。

但是你的代码是错误的。它不应该设置errno,也不应该测试它,除非方法返回 -1。它应该是:

while ((numBytes = Read(socket, temp, sizeof temp)) > 0 || numBytes == -1 && errno == EINTR)
{
   SendHTTPResponse(socket, temp, numBytes);
}

您不需要memset()调用,也不需要为尾随空值留出任何空间,只要SendHTTPResponse()适当注意您传递它的长度即可。它当然不应该寻找尾随空值本身。

而 3000 是一个非常奇怪的缓冲区大小。我自己会用8192。

于 2013-08-05T01:42:48.263 回答
0

这只是对您的问题的有根据的猜测。正如其他人所说,您没有发布足够的信息来发现您的错误。

二进制数据和文本数据最大的区别在于前者(EDIT,感谢 EJP)可以包含空('\0')字节。如果您使用字符串函数(例如 strlen()),它们会将这些函数解释为字符串结尾,因此您将丢失数据。

于 2013-08-05T02:19:24.750 回答