请问closesocket(socket)为什么不会释放句柄数和内存资源啊?

sqilong 2011-10-01 11:00:43
//代码简化如下
int TcpClinet(SOCKET &s,const char * ip,WORD port)
{
s=socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
if(s!=-1)
{
sin.sin_family = AF_INET;
sin.sin_port=htons(port);
sin.sin_addr.s_addr=inet_addr(ip);
long ret=connect(s,(LPSOCKADDR)&(sin),sizeof(sin));
if(ret!=0)
{
closesocket(s);
s=-1;
}
return ret;
}
return -1;
}

int main(int argc, char* argv[])
{
long ret=-1;
socket s;
while(ret!=0)
{
ret=TcpClinet(s,"192.168.1.2",888);//该主机一直没开机
if(ret!=0)
{
Sleep(1000);
}
}
}
//一次意外该主机一直没开机,我发现本进程的句柄数在不断的飙升,后排查发现是TcpClinet这个函数中的
//closesocket(s)没有释放句柄资源导致的,请问为什么调用closesocket(s)没有释放句柄资源呢?如何解决?
...全文
818 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
sqilong 2011-10-02
  • 打赏
  • 举报
回复
我还没有连上服务器啊,还有就是我加了立即端开的选项也没有用啊。
struct linger opt;
opt.l_onoff=1;
opt.l_linger=0;
if (setsockopt(sock, SOL_SOCKET, SO_LINGER, (char *)&opt, sizeof(linger)) == SOCKET_ERROR)
{//设置失败
}
closesocket(Socket);
这样后,进程中的句柄数还是在上升。进程中的句柄数绝对是网络句柄没有释放导致的,因为我测试时没有使用其它任何的代码,一但我不连接的话,句柄数就不会上升。
bluesky12312388 2011-10-02
  • 打赏
  • 举报
回复
setsockopt  加上SO_LINGER 标识让他立即关闭。
sqilong 2011-10-02
  • 打赏
  • 举报
回复
实在找不是还有什么原因了。
sqilong 2011-10-02
  • 打赏
  • 举报
回复
找到原因了,是垃圾防火墙导致的。把防火墙卸载了就好了。谢谢各位了。
sqilong 2011-10-01
  • 打赏
  • 举报
回复
closesocket(s);返回一直都为0;
WaistCoat07 2011-10-01
  • 打赏
  • 举报
回复
判断下closesocket(s);返回值
sqilong 2011-10-01
  • 打赏
  • 举报
回复
是啊,但我每次都有调用closesocket(s)来关闭句柄啊。
但我的句柄数不是保持不变,而是在不断的增加的。
maoxing63570 2011-10-01
  • 打赏
  • 举报
回复
它在一个循环中啊,你在关闭的同时,你也在s=socket(AF_INET, SOCK_STREAM, IPPROTO_IP);创建
sqilong 2011-10-01
  • 打赏
  • 举报
回复
是啊,但返回不是0时就表示连接不上,我就调用closesocket(s);来释放句柄
但发现本进程的句柄数在不断的飙升,就表明closesocket(s);没有释放句柄的资源了。
WaistCoat07 2011-10-01
  • 打赏
  • 举报
回复
connect返回值是0表示成功。

65,187

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧