实现1对N可配置Socket服务器程序思路

实现1对N可配置Socket服务器程序思路

大致思路:框架是MFC单文档程序, 从CSocket派生一个CListen类,然后在Doc类:CWebDoc中的OnNewDocument函数中new一个CListen对象,将该对象指针保存到文档类成员m_pSocket中,并把文档指针传递给CListen类:

OnNewDocument接着调用CListen的Create:

OnNewDocument接着调用CListen的Listen,开始监听服务器m_wwwPort端口:

当服务器m_wwwPort端口侦听到连接请求时,CListen类的OnAccept重载函数会被调用。在CListen类的OnAccept中调用我们在Doc类中自建的一个OnAccept()函数。

 

显然,一旦某个客户的连接请求到来,我们在Doc类中自建的OnAccept()函数,马上被调用,代码如上。Doc类的OnAccept()函数马上new一个CClient(派生自CSocket),并把文档指针传递给CClient类:

接下来用CListen指针m_pSocket来调用Accept,并把刚刚new的CClient对象作为参数:

如无意外,一个套接字连接就建立了。因为服务器要1对N服务,为了维护这些连接,我们在文档类增加了一个CPtrList成员:m_listConnects; 连接一旦建立,立即测试当前m_listConnects中的已有连接数是否已经达到最大连接限制:

当然,如果连接List还没有满载,马上调用m_listConnects的AddTail把CClient指针加进指针链表成员中,以便后来服务器与各客户收发报文使用。

在CClient的OnReceive函数中,我们接受客户发来的数据,并分析数据,处理数据,完后发送响应报文:

在CClient的OnClose函数中,我们可以记载客户关闭套接字的事件:

为了及时关闭和释放那些长期不活动的客户连接,CClient类维护了一个LOG_RECORD成员m_LogRec,记载了其相关的信息。例举一个LOG_RECORD结构大致如下:

在CMainFrame类开启一个Timer以1分钟为间隔,定期清理释放不活跃客户:

在文档类的CheckIdleConnects函数中:

这种模式的服务器,理论上讲,可连接客户的数量theApp.m_nMaxConnects可以是无限大的,当然你的计算机需要有足够的内存来为各个客户连接维护一个CClient对象。并有超快的CPU来及时响应各个客户请求。就实际运行情况而言,如果你的CClient逻辑不是太过复杂,CClient对象不是太庞大,如果拿一台2GB内存和2GB主频的计算机来跑该服务程序,你可以把连接数上限theApp.m_nMaxConnects配置为500左右,这是毫无问题的。当然如果是网络游戏服务器,需要同时上万人在线,该模式的程序任然是可以的,前提是你需要高性能的服务器来支持,只要你的服务器性能足够优良,把连接数上限theApp.m_nMaxConnects配置为百万都不是什么问题by Loomman, QQ:28077188, MSN: Loomman@hotmail.com QQ裙:30515563 ☆程序天堂☆ 请尊重作者原创,转载注明来自裂帛一剑博客,谢谢合作。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值