套接字接受在Windows上消耗我的内存而不释放
发布时间:2020-12-14 03:59:44 所属栏目:Windows 来源:网络整理
导读:我在C中编写了一个非常小的函数,打开一个套接字,接受连接并立即关闭它们. 问题是,每个连接都会占用一些内存,而不会在任何时候将其释放到操作系统.我用大约300K请求运行ab(apache基准测试),并且进程内存不断增长(最后几百兆字节). 我知道进程并不总是将其空闲
我在C中编写了一个非常小的函数,打开一个套接字,接受连接并立即关闭它们.
问题是,每个连接都会占用一些内存,而不会在任何时候将其释放到操作系统.我用大约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:%dn",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上,winsock使用closesocket来正确关闭和清理套接字.
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- windows – 使用Task Scheduler运行时,我的PowerShell脚本不
- mvvm – 有没有人知道ReactiveUI的ReactiveCommand的一个很
- .net – Windows窗体的未处理的异常记录
- windows-8 – 如何在Windows 8上为WebDAV启用基本身份验证
- 在windows和linux上编译
- 如何在windows中查看正在执行的java程序的classpath和jvm a
- windows-7 – 不在路径上的Chocolatey安装包
- 怎样用命令行开启或关闭Windows服务
- microsoft-teams – 如何调试Microsoft Teams选项卡中执行的
- windows-server-2003 – Windows 2003/2008 DC或路由器中的
推荐文章
站长推荐
- 什么是在Windows Server 2003中运行的优秀SSH服务
- windows-server-2012 – windows server 2012解决
- windows – NetBIOS“免费”网络?
- 如何在Windows上用Java创建 – 然后 – 原子重命
- Windows 2008 R2 – 内核(系统进程PID = 4)正在锁
- 使用带Stretch的图像控制= UniformToFill – WP7
- 如何在Windows中更改grails.exe控制台颜色?
- APC Injection of Windows 7 x86 in R0
- 使用Windows API在c中异步操作:使用哪种方法以及
- windows-10 – DEP0001:意外错误:-2147014836最
热点阅读