大佬教程收集整理的这篇文章主要介绍了套接字接受在Windows上消耗我的内存而不释放,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
问题是,每个连接都会占用一些内存,而不会在任何时候将其释放到操作系统.我用大约300K请求运行ab(apache基准测试),并且进程内存不断增长(最后几百兆字节).
我知道进程并不总是将其空闲内存返回给操作系统.但是一旦它超过几兆字节,我认为它应该返回内存还是我错了?
这只发生在Windows上.在Linux上,我的内存使用率几乎都是进程启动使用的.
用GCC 4.8.2编译.在Windows Server 2008 R2和Windows 8.1上测试过.
void http_server_start(void) { int rc; struct sockaddr_in cfg; #ifdef _WIN32 WORD ver; WSADATA data; ver=MAKEWORD(2,2); rc=WSAStartup(ver,&data); if(rc != 0){ printf("Error: Unable to initialize WSA (%d)",rc); } #endif memset(&cfg,sizeof(cfg)); cfg.sin_family = AF_INET; cfg.sin_addr.s_addr = htonl(INADDR_ANY); cfg.sin_port = htons(PORT); server = socket(AF_INET,SOCK_STREAM,6); int reuseaddr=1; if (setsockopt(server,SOL_SOCKET,SO_REUSEADDR,(char*)&reuseaddr,sizeof(reuseaddr)) == -1){ rc=GetLastErrorEx(); printf("Error: Unable to set SO_REUSEADDR (%d)\n",rc); } else if (bind(server,(struct sockaddr *)&cfg,sizeof(cfg)) < 0 ) { rc=GetLastErrorEx(); printf("Error: Unable to bind socket (%d)\n",rc); close(server); } else if (listen(server,QUEUE_SIZE) < 0) { rc=GetLastErrorEx(); printf("Error: Unable to listen (%d)\n",rc); close(server); } else { printf("Listening on %s:%d\n",inet_ntoa(cfg.sin_addr),ntohs(cfg.sin_port)); int client; struct sockaddr_in addr; int addrlen=sizeof(addr); do { client=accept(server,(struct sockaddr*)&addr,&addrlen); if(client != -1){ shutdown(client,SHUT_RDWR); close(client); } } while(1); } }
以上是大佬教程为你收集整理的套接字接受在Windows上消耗我的内存而不释放全部内容,希望文章能够帮你解决套接字接受在Windows上消耗我的内存而不释放所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。