多线程socket的一个小问题! 来者有分!

山的那边还是山~ 2008-08-20 02:53:49
具体是这样的:
服务器端针对每个客户端的连接建立一个线程,建立的线程是采用RUN_TIMECLASS的方法来建立的,
当业务处理完后,线程自然结束。
问题是在结束线程时,在服务器端与客户端的socket连接不调用closesocket()是不是可以?还是不可以?
...全文
119 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
Cricketol 2008-08-21
  • 打赏
  • 举报
回复
给你看个我写的例子

//套接字信息结构
struct DATA
{
SOCKET sock;
SOCKADDR_IN addr;
};

//循环监听
while(1)
{
//这的new等下在线程里用delete释放
DATA *data = new DATA;
data->sock = socket(AF_INET,SOCK_STREAM,0);
//阻塞等待连接
data->sock = accept(ser,(sockaddr *)&data->addr,&len);
cout<<inet_ntoa(data->addr.sin_addr)<<" connected."<<endl;
//为新客户创建新线程
CreateThread(0,0,(LPTHREAD_START_ROUTINE)SubThread,(LPVOID)data,0,0);
}
//线程里面
DWORD SubThread(LPVOID param)
{
DATA *p = (DATA *)param;

...................//处理业务

closesocket(p->sock);//关闭套接字,释放内存
//删除套接字信息结构,释放内存
delete p;
return 0;
}


jsycsj 2008-08-21
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 cnzdgs 的回复:]
不调用closesocket就会造成资源泄露,次数较少时其影响可以忽略,进程结束时会自动释放所有资源,但如果次数多了,最终会造成资源耗尽,创建新的socket会失败。
[/Quote]
分析透彻,就是要看你实际用的场合了,不过最好还是放了吧,留在那也是没用,除非想办法重用
danscort2000 2008-08-21
  • 打赏
  • 举报
回复
不可以,必须closesocket
除非你整个进程结束,那你可以不调用,否则必须调用
zhkefa 2008-08-21
  • 打赏
  • 举报
回复
还是closesocket()下吧,以免出问题,,
xsc2001 2008-08-21
  • 打赏
  • 举报
回复
每一个socket都会占用一个端口的,而端口资源是有限的,所以在不用的时候要关闭。
  • 打赏
  • 举报
回复
多谢各位的关注,结帖!
cnzdgs 2008-08-20
  • 打赏
  • 举报
回复
不调用closesocket就会造成资源泄露,次数较少时其影响可以忽略,进程结束时会自动释放所有资源,但如果次数多了,最终会造成资源耗尽,创建新的socket会失败。

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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