C套接字使内存只泄漏二进制数据



我正在编写一个web代理,它可以很好地处理可以转换为ASCII文本的网页。然而,当我尝试查看带有二进制数据的页面时(我一直在使用Youtube.com),某个地方出现了内存泄漏,同样的几个字符会在我发送给客户端的字符串末尾一遍又一遍地重复(并且会出现在其他明显不应该出现的地方)。

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

有人有什么见解吗?

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

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

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

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

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

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

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

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

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

最新更新