TCP Server关闭服务后,在不用链表保存Client的情况下,如何关闭所有已经连接上的Client?

zhllxt 2016-07-04 09:59:40
Server端启动后,有很多Client连接进来,每连接进一个Client都会new出来一些附加的数据资源,
服务端关闭监听套接字,准备退出后,那些已经连接上的Client如何能得到通知呢?这样我可以在通知里去delete掉那些数据资源。
...全文
299 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
an_bachelor 2016-07-17
  • 打赏
  • 举报
回复
根本不用纠结锁不锁 现在我想通了 java都能用得飞起 其实要跑代码的公司 不会差那几台机器 几0G内存 我 基本上只自己存个socket,别的往数据库一丢 甚至socket也可以往数据库一丢
kakabulusi 2016-07-17
  • 打赏
  • 举报
回复
我也是用的 CPtrArray 进行管理的。
shenyi0106 2016-07-13
  • 打赏
  • 举报
回复
引用 11 楼 newTTTTTT 的回复:
[quote=引用 10 楼 zhllxt 的回复:] 没办法我就保存吧, [quote=引用 8 楼 newTTTTTT 的回复:] 如果客户端新连入,服务器端是建立了子线程来维持之间的通讯,可以不保存socket,在子线程里面创建该socket,然后在子线程里面当blived=0时,子线程结束执行,自己释放自己的socket。不知道这种方式是否可行? [/code]
不行,2000个连接建2000个线程是不现实的。[/quote] 为什么不现实呢?本来每个连接之间就应该是逻辑上的彼此独立的线程,难道你希望用单线程来处理吗? [/quote] 这个问题,最好找本《操作系统原理》,然后看一下处理机调度部分的内容,在理解一下线程是什么? 然后,在来看看你的回答,是不是会觉得自己回答的草率了
公共马甲0315 2016-07-13
  • 打赏
  • 举报
回复
引用 10 楼 zhllxt 的回复:
没办法我就保存吧, [quote=引用 8 楼 newTTTTTT 的回复:] 如果客户端新连入,服务器端是建立了子线程来维持之间的通讯,可以不保存socket,在子线程里面创建该socket,然后在子线程里面当blived=0时,子线程结束执行,自己释放自己的socket。不知道这种方式是否可行? [/code]
不行,2000个连接建2000个线程是不现实的。[/quote] 为什么不现实呢?本来每个连接之间就应该是逻辑上的彼此独立的线程,难道你希望用单线程来处理吗?
笨笨仔 2016-07-12
  • 打赏
  • 举报
回复
个人也比较喜欢使用MAP保存,将连接成功的套接字句柄保存到MAP结构中,并为之命名一个KEY,需要结束时从服务端取出套接字逐一closes。
公共马甲0315 2016-07-12
  • 打赏
  • 举报
回复
如果客户端新连入,服务器端是建立了子线程来维持之间的通讯,可以不保存socket,在子线程里面创建该socket,然后在子线程里面当blived=0时,子线程结束执行,自己释放自己的socket。不知道这种方式是否可行?

//这个是我写的代码片段
static UINT myThreadFunc(LPVOID param)
{
	LPtheClient pa = (LPtheClient)param;
	if(!pa)
		return 1;

	CloseClientSocket(pa);
	if(!ConstructClientSocket(pa))
		return 1;
	while(1)
	{
		if(pa->uExitFlag)
		{
			closesocket(pa->sClient);
			pa->sClient = INVALID_SOCKET;
			AfxEndThread(109);
			break;
		}
	//...
	}
	//...
}
zhllxt 2016-07-12
  • 打赏
  • 举报
回复
没办法我就保存吧,
引用 8 楼 newTTTTTT 的回复:
如果客户端新连入,服务器端是建立了子线程来维持之间的通讯,可以不保存socket,在子线程里面创建该socket,然后在子线程里面当blived=0时,子线程结束执行,自己释放自己的socket。不知道这种方式是否可行? [/code]
不行,2000个连接建2000个线程是不现实的。
kakabulusi 2016-07-11
  • 打赏
  • 举报
回复
你也可以尝试使用CPtrArray 进行链表的实际维护。比较方便的。
kakabulusi 2016-07-11
  • 打赏
  • 举报
回复
没办法,只能找到各socket资源,closesocket
shenyi0106 2016-07-04
  • 打赏
  • 举报
回复
没有,除了句柄外(这个东西还是内核保存的),它不保存任何东西。 所以,你必须要自己保存。 应用层的锁消耗还是很小的,尤其是这种添加删除操作,基本上没有消耗,不必太纠结于此。 对于管理结构,个人比较喜欢用MAP这种结构,因为对于服务器而言,大多数都是等待客户端连接和关闭,而这时是可以得到连接句柄的,相比较list而言,用MAP可以显著减少操作时间。 对于大多数服务器程序而言,客户端管理,内存管理,任务管理是三个重要模块。
Eleven 2016-07-04
  • 打赏
  • 举报
回复
你需要对每个accept返回的SOCKET句柄,调用closesocket
赵4老师 2016-07-04
  • 打赏
  • 举报
回复
搜“连接池 线程池”
zhllxt 2016-07-04
  • 打赏
  • 举报
回复
引用 1 楼 shenyi0106 的回复:
必须保存对象,在退出前释放。windows没有提供这种自动保存机制
无论是select iocp等模型都没有提供这种机制么? 我不喜欢用链表保存的原因是,用链表就要用锁来保护链表,涉及的东西就多了,虽然这个涉及的面不是多到让人无法忍受,但还是想越简单越好。
shenyi0106 2016-07-04
  • 打赏
  • 举报
回复
必须保存对象,在退出前释放。windows没有提供这种自动保存机制

18,356

社区成员

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

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