首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

socket接收数据,数据来不及处理的有关问题

2012-08-07 
socket接收数据,数据来不及处理的问题问题是这样的:客户端在一台电脑上,在不断的采集发送数据,速度很快。服

socket接收数据,数据来不及处理的问题
问题是这样的:

客户端在一台电脑上,在不断的采集发送数据,速度很快。

服务器端接收数据,还需要做处理,一边接收一边处理。

问题客户端发送的速度不稳定,服务器端可能会来不及处理,请问通常情况下该如何处理这种情况?

是不是需要在服务器端开辟一个大的数组用来存储来不及处理的数据?

如果是这样,请问是不是需要用双线程来处理,因为接受数据需要不停的进行。。。



[解决办法]
多线程处理
[解决办法]
TCP是可靠的, 没听说过来不及处理这回事.
UDP不可靠, 丢包也是需要自己容忍或者处理的.
[解决办法]
如果用udp,得自己加缓冲队列和多线程,缓冲队列也要有限制,防止爆内存。多线程的多用只要是异步化网络I/O和业务流程,不相互阻塞,起几个线程看情况

如果用tcp,缓冲队列可以不要,因为tcp自动调速,你接受慢对端发送也会降速,这时候根基性能要求起多线程,尽量用线程池+IO多路转接,别简单的一个线程一个链接,尤其是连接可能比较多的时候
[解决办法]

探讨

使用TCP传送的

[解决办法]
探讨
如果用udp,得自己加缓冲队列和多线程,缓冲队列也要有限制,防止爆内存。多线程的多用只要是异步化网络I/O和业务流程,不相互阻塞,起几个线程看情况

如果用tcp,缓冲队列可以不要,因为tcp自动调速,你接受慢对端发送也会降速,这时候根基性能要求起多线程,尽量用线程池+IO多路转接,别简单的一个线程一个链接,尤其是连接可能比较多的时候

[解决办法]
探讨
如果用udp,得自己加缓冲队列和多线程,缓冲队列也要有限制,防止爆内存。多线程的多用只要是异步化网络I/O和业务流程,不相互阻塞,起几个线程看情况

如果用tcp,缓冲队列可以不要,因为tcp自动调速,你接受慢对端发送也会降速,这时候根基性能要求起多线程,尽量用线程池+IO多路转接,别简单的一个线程一个链接,尤其是连接可能比较多的时候

[解决办法]
去年的时候,我对这个问题的思路不清晰,今年清晰了。大家说的都挺不错。问题必须量化。

客户端有多少,每台每秒的数据量有多大,这样总数据量就清楚了。
再看服务器,每秒可以处理多少,能不能处理掉。注意客户端上百时,而且数据量大,不宜采用每个线程处理一个客户端,采用IOCP。数据包的解析估计费不了多少时间,如果需要写入文件或数据库,时间会花在这里,如果突发数据量大于文件读写吞吐量,这里可以做一个任务缓冲池。

这是我的一点想法,欢迎拍砖。
[解决办法]
因为一个线程处理一个客户端,光线程切换就会搞挂服务器。
[解决办法]
对于TCP缓冲队列也是必须的,网络层不断接收,投递到缓冲队列,处理线程从队列中提取任务并处理。
但是为了防止处理线程无法处理大量任务导致缓冲队列爆掉,必须设置一个阀值,当缓冲队列中任务的数量
超过这个阀值时,网络层停止recv,这可以使得发送方发送速度减缓,但是如果你的采样频率是固定的,发送速度
减缓可能又会导致发送方发送队列爆满。
[解决办法]
在windows上考虑使用IOCP,在Linux上可虑使用epoll
[解决办法]
哇塞…来学习咯
[解决办法]
换台服务器机子吧,既然都来不及处理了,搞再多什么线程都是浮云,只会增加负担。

热点排行