免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: BetonArmEE
打印 上一主题 下一主题

[C] 单进程多线程服务器存在这样的弊端 [复制链接]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
121 [报告]
发表于 2014-10-14 11:56 |只看该作者
回复 120# guojinshuai


    是单长连接吗?可以这样设计,服务端通讯进程负责管理单长连接、接收报文,放入一个请求队列,后端启一组进程从队列里抓交易处理完,塞回响应队列,通讯进程从响应队列中读出响应报文,发给单连接。因为通讯进程一边要监控连接数据,一边要监控响应队列消息,必须设计成多路复用,比如通讯进程设计成兄弟俩进程,中间用一个匿名管道连接,对外的一个负责管理单长连接,还有更重要的是select单长连接socket和匿名管道,对内的一个负责堵塞读队列,一旦有消息就转发到匿名管道,对外的一个侦测到匿名管道有数据就读取并转发到单长连接socket。还有一种设计是响应报文被对内兄弟进程读出后放入共享内存,通过匿名管道发一个字节告诉对外兄弟进程来转发共享内存中的响应报文到单长连接。其它设计还有很多种,根据具体的需求场景和性能要求选择最适合的。

论坛徽章:
0
122 [报告]
发表于 2014-10-14 12:56 |只看该作者
回复 121# BetonArmEE

我是初学者,您说的意思我明白,但是我代码写不出来。。。
你看我的这个想法可行么?
由于是端对端连接,也就只有一个socket进行连接,我accept之后,创建子进程。主进程负责报文的接收与解析,子进程负责数据的处理与发送。由于联机交易有好几个,所以主进程每收到一份报文进行解析后写入不同的文件(文件名根据交易代码区分);子进程通过读相关交易的文件得到解析后的数据,然后进行此交易的数据处理与发送。
可以的话想加你的qq,给你发私信了。
   

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
123 [报告]
发表于 2014-10-15 11:02 |只看该作者
本帖最后由 yulihua49 于 2014-10-15 11:14 编辑
guojinshuai 发表于 2014-10-14 12:56
回复 121# BetonArmEE

我是初学者,您说的意思我明白,但是我代码写不出来。。。

就一个客户端?那么,不需要子进程。依次调用业务函数就可以了。
搜一下TLV协议。
http://blog.csdn.net/chexlong/article/details/6974201
补充一点,Type,其实就是函数号,服务器准备一组业务函数。
收到客户端的包后,根据type,调用对应的函数。
就这么简单。

SDBC就是扩展的TLV协议。

那个V,如果是一些结构,就可以用“结构体工具”进行序列化和反序列化。
如果是文件,就需要进行多包传输。这时服务器就进入“有状态服务”模式。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP