使用socket连接服务器的内存泄露问题,有代码
以下代码可在vs2008下编译通过,其中61.135.169.125为百度网站的IP地址,作为测试用。程序产生的问题在于,当用任务管理器查看程序耗占的内存时,发现耗占内存以8K,12k或者更大的数值持续增加。不知道是哪里有问题。请大家提出看法,谢谢~~~~
#include <iostream>#include <Windows.h>#include <WinSock2.h>int main(int, char**){ while (true) { SOCKET s = socket(AF_INET, SOCK_STREAM, IPPROTO_IP); sockaddr_in addr; memset(&addr, 0, sizeof(sockaddr_in)); addr.sin_family = AF_INET; addr.sin_addr.S_un.S_addr = inet_addr("61.135.169.125"); addr.sin_port = htons(80); if (connect(s, (SOCKADDR*)&addr, sizeof(addr)) == SOCKET_ERROR) { std::cout << "connect error" << std::endl; } shutdown(s, SD_SEND); closesocket(s); } return 0;}
//================================================================= #include <WinSock2.h>#include <Windows.h>#include <iostream.h>#pragma comment(lib,"ws2_32.lib")void InitSocket(){ WORD wVersionRequested; WSADATA wsaData; int err; wVersionRequested = MAKEWORD( 2, 2 ); err = WSAStartup( wVersionRequested, &wsaData ); if ( err != 0 ) { return; } if ( LOBYTE( wsaData.wVersion ) != 2 || HIBYTE( wsaData.wVersion ) != 2 ) { WSACleanup( ); return; }}void main(int, char**){ InitSocket(); while (true) { SOCKET s = socket(AF_INET, SOCK_STREAM, IPPROTO_IP); sockaddr_in addr; memset(&addr, 0, sizeof(sockaddr_in)); addr.sin_family = AF_INET; addr.sin_addr.S_un.S_addr = inet_addr("61.135.169.125"); addr.sin_port = htons(80); if (connect(s, (SOCKADDR*)&addr, sizeof(addr)) == SOCKET_ERROR) { cout << "connect error" <<endl; } shutdown(s, SD_SEND); closesocket(s); } WSACleanup( ); return ;}
[解决办法]
倒不是很占内存,也没有持续增长,只是你的一个while循环,太耗CPU。。。
[解决办法]
貌似closesocket只是说那个套接字不可以用了,它实际占用的资源需要一定的时间才能释放掉的。
你可以用防火墙看看,每次申请到的socket套接字会不断上涨,然后过一段时间又会从很小的数值开始上涨。
因为你刚刚关掉的套接字,必须要等一段时间才能释放掉所有的资源。
[解决办法]
你写的死循环啊,Debug吧,内存增长很正常,只要不一直增下去即可,connect完一次Sleep(1000)试试还会不会不断增
[解决办法]
测试1小时-2小时,以前我写的代码,开3天都内存都没增长过。
实在不行用CheckBounds查查看吧