免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1141 | 回复: 7
打印 上一主题 下一主题

急!在线等!  关闭 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-11-09 10:46 |只看该作者 |倒序浏览
我在linux redhat 9.0上  建立了一个tcp socket的server。
同时以300个线程处理300个socket连接。
遇到的问题是:
如果其中有一个连接由于网络问题(server发送的速度 远大于client的接收速度)会引起socket缓存中囤积数据,当数据达到一定的量以后,发现所有300个socket处理都停止了,但是write和read也不报错。
(现象就是:新的连接连不上了。所有300个client给server发送数据,server也没有任何反应,但是server进程还是在的。用netstat查看端口所有连接还是ESTABLISHED的。)

请问各位大侠为什么会有这种现象,我该如何解决呢?

论坛徽章:
0
2 [报告]
发表于 2005-11-09 10:51 |只看该作者
那就发送端可以搞个队列,加上延时好了

论坛徽章:
0
3 [报告]
发表于 2005-11-09 10:55 |只看该作者
用多进程试试

论坛徽章:
0
4 [报告]
发表于 2005-11-09 11:00 |只看该作者
原帖由 henngy 于 2005-11-9 10:51 发表
那就发送端可以搞个队列,加上延时好了


如果这样做的话,因为延时的不同,每个连接又要有专门的线程去读队列然后发送?

论坛徽章:
0
5 [报告]
发表于 2005-11-09 11:03 |只看该作者
原帖由 FH 于 2005-11-9 10:55 发表
用多进程试试



因为程序中所有的线程都需要相互通信的,所以如果是多进程的话,所有进程间的通信又是一个很大的开销,我想可能会得不偿失。

论坛徽章:
0
6 [报告]
发表于 2005-11-09 11:08 |只看该作者
原帖由 marco_chan 于 2005-11-9 11:00 发表


如果这样做的话,因为延时的不同,每个连接又要有专门的线程去读队列然后发送?



恩,,做成队列的话,这步操作是必要的,,至少你要发的东西你是可以控制的。

论坛徽章:
0
7 [报告]
发表于 2005-11-09 11:12 |只看该作者
做队列的前提是发送的数据可以控制,当队列满时可以暂定取数据,,如果无法控制数据的话,,这个办法是行不通的,你可以考虑在接收端开进程来分摊数据的接收

论坛徽章:
0
8 [报告]
发表于 2005-11-09 11:23 |只看该作者
原帖由 henngy 于 2005-11-9 11:12 发表
做队列的前提是发送的数据可以控制,当队列满时可以暂定取数据,,如果无法控制数据的话,,这个办法是行不通的,你可以考虑在接收端开进程来分摊数据的接收




我想实现得就是象网络游戏一样,假如300个人在同一个场景内,那么他们走路得消息应该相互传送。

如果由于信息量太大,把后面得消息屏蔽得话,整个效果就会有问题。如果以链表得方式无限的插入链表直到内存耗尽的话,是否会好点?(毕竟大量的数据传送可能只是一段时间)

还有我想问一下各位,如果我要做这样一个大场景的话,是否有更好的处理方法?(我现在的方法就是,tcp的socket,每个连接一个线程来处理)
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP