求高吞吐量,高性能的网络传输方案!

zhujianping_es 2004-08-30 05:07:01
需求:
现在有1000-6000(假设有这么多)个PDA(通过802.11模块), 要向一台Windows 2K,(or 2K Server)发请求包,请求Server提供服务,Server要Read ,Write,Update 后台数据库(我计划用MS SQL Server),然后把数据库操作的结果发给客户机!

我的想法:
一个完成端口+数据包发送线程池 处理Server=====〉PDA的数据 从发送队列中取出要发送的数据发送出去!

一个完成端口+数据包接受线程池 处理PDA======〉Server的数据 把接受到的数据挂到
一个接受队列中


再用一个 逻辑处理线程池 完成后台数据库的操作。

请用过的大N们指点一下,有什么资源的(references,code snippets)发一点上来啦!

...全文
1031 112 打赏 收藏 转发到动态 举报
写回复
用AI写文章
112 条回复
切换为时间正序
请发表友善的回复…
发表回复
happyforevery 2004-09-16
  • 打赏
  • 举报
回复
很好很好, 很久没有百家争鸣了,!!!!!!!!!!!!!!
月吻长河 2004-09-16
  • 打赏
  • 举报
回复
科学是没有公司界限的,但工程师是有自己老板的。
cryptonym 2004-09-16
  • 打赏
  • 举报
回复
受益匪浅丫,要是大家都能透露一点核心高效的技术点就更好了,老是摸索也太慢了。科学是没有公司界限的嘛,又不要你的源代码,只想知道方法而已。
chuxue1006 2004-09-05
  • 打赏
  • 举报
回复
回复人: wwwsq(wwwsq) ( ) 信誉:100 2004-9-3 23:28:51 得分: 0



to chuxue1006() :

每秒钟9000,是收发数据和数据库操作一起(数据库在其他机器上)。光是收发数据,在4000人民币的pc上,一秒钟可以接收发送小数据各27000次,此时cpu达到100%,网络带宽有剩余。

你为什么不去试试你一秒钟能做到多少次通讯呢?

我对这个话题失去兴趣了。

-------------------------------

我同样对这个话题失去了兴趣,我发现你没有仔细看别人回复的习惯。只顾自己说自己的。,我上面说过了,在带宽用光的情况下,我程序实际收发的次数和理论上算出来的次数大致相等。难道你不会算?

还有,你数据库操作和网络收发一起9000次。我再说一次,数据库操作与网络收发的那个IOCP没关系。开始我也说了,你程序写成这样,我只能说你浪费了很多东西,在你操作数据库的时候,你的网络IOCP实际上还很空闲。


zhujianping_es 2004-09-05
  • 打赏
  • 举报
回复
没得到一点信息,FT!
继续期待!
phoenixandlinda 2004-09-04
  • 打赏
  • 举报
回复
gz
UDX协议 2004-09-04
  • 打赏
  • 举报
回复
还有一点,我要说的说的是,发送端如果每次发送很小字节,比如18字节或256字节,在接收端,可能一次就接收完8096字节。如果是tcp.
也就是说,发送端如果发送端发了100次,结果接收端只动作一次就收完。这在重叠或完成端口中很正常。
UDX协议 2004-09-04
  • 打赏
  • 举报
回复
客户端和服务器端在同一台机器上测试没任何意义.
如果能把你的adsl带宽用完,且不占很多cpu的话,才是好程序。
如果上有传空间的话,希望能给以上二位上传程序,让大家一起来测试。
ywybetter 2004-09-03
  • 打赏
  • 举报
回复
很好
copy_paste 2004-09-03
  • 打赏
  • 举报
回复
大家给个测试方法和数据,我也测试一下,我也看看我这边的程序的效率.

还有,wwwsq和elssann我觉得两位最好交换各个测试的服务端程序,分别测试,给出结果来最好,不然两位意见相左,话说的都理,我们这些后学者很难分清.所以最好两位将程序分别换一下,来测试,得出结果,再来点评.不然再这样说下去,好像没什么结果.

或者大家将自己的服务端改一下,写一个大致的测试功能及客户端发包规则,这样很容易得出结果来了.
wwwsq 2004-09-03
  • 打赏
  • 举报
回复
从比较普遍比较基础的角度来衡量通讯层性能,主要参数应该是单位时间内io事件触发的次数。
wwwsq 2004-09-03
  • 打赏
  • 举报
回复
连接数量与性能之间,只有在特定环境下依靠连接活跃程度,两者才能建立关系。

从比较普遍比较基础的角度来衡量通讯层性能,主要参数应该是单位事件内io事件触发的次数。
wwwsq 2004-09-03
  • 打赏
  • 举报
回复
to chuxue1006() :

每秒钟9000,是收发数据和数据库操作一起(数据库在其他机器上)。光是收发数据,在4000人民币的pc上,一秒钟可以接收发送小数据各27000次,此时cpu达到100%,网络带宽有剩余。

你为什么不去试试你一秒钟能做到多少次通讯呢?

我对这个话题失去兴趣了。
c4313848 2004-09-03
  • 打赏
  • 举报
回复
精彩极了,好久没有看到过了
elssann 2004-09-03
  • 打赏
  • 举报
回复
把客户端的printf()去掉以后
一个服务器端,一个客户端的测试结果是 1,4000 每秒.
一个服务器端,两个客户端的测试结果是 1,2000 每秒.

所有进程都在同一台电脑上运行.

----------------------------------------------------------

客户端和服务器端在同一台机器上测试没任何意义。
Hellboy 2004-09-03
  • 打赏
  • 举报
回复
服务器端占用的cpu40%左右.
客户端占用25%左右.
另外System进程占用35%左右.
elssann 2004-09-03
  • 打赏
  • 举报
回复
回复人: Hellboy(int argc, char* argv[]) ( ) 信誉:98 2004-09-03 10:26:00 得分: 0


发一个刚刚出来的测试结果

在同一台C2.4,512内存的PC机上,用IOCP写的服务器端和阻塞模式的客户端。
服务器端不停的发送数据(发送的每个数据为18字节),客户端不停的接收数据。

这样测试的结果是服务器端每秒发送6000次。

如果同时开了8个客户端是4000左右

cpu的占用都是100%。
因为是在同一台电脑上,带宽的应该没什么上限了,而且发送的都是很少量的数据。
这个只是一个简单的例子测试,仅供参考。

to:elssann()
你前面提到的,socket不用遍历,直接定位的方法,是不是这样做的?

每个socket都回有个唯一的int值,程序中有个足够大的数组可以容纳任何所有值得socket
每次接受连接以后,就设置相应的位置。
这样要定位每个客户端,只要直接用socket的值去索引数组就行了。



-----------------------------------------------------

我怀疑你的程序写得有问题,我在C 1.7G 256M上测试,收发的数据是512字节的包。收发的次数都比你这个高。真的,绝对不骗你。



另外,我的那个直接定位,不是用的数组,用数组你有没有考虑过这种情况,当某个连接断开后,他所占用的那个数组元素就无效了,新的连接来后,他的这个元素就可以重新分配给这个新的连接,所以,每次新的连接上来的时候,还是需要在数组中查找。。。
Hellboy 2004-09-03
  • 打赏
  • 举报
回复
把客户端的printf()去掉以后
一个服务器端,一个客户端的测试结果是 1,4000 每秒.
一个服务器端,两个客户端的测试结果是 1,2000 每秒.

所有进程都在同一台电脑上运行.
shootingstars 2004-09-03
  • 打赏
  • 举报
回复
呵呵,有点意思,大家都口说无凭,拿个实际点的例子看看。 ^_^
Hellboy 2004-09-03
  • 打赏
  • 举报
回复
发一个刚刚出来的测试结果

在同一台C2.4,512内存的PC机上,用IOCP写的服务器端和阻塞模式的客户端。
服务器端不停的发送数据(发送的每个数据为18字节),客户端不停的接收数据。

这样测试的结果是服务器端每秒发送6000次。

如果同时开了8个客户端是4000左右

cpu的占用都是100%。
因为是在同一台电脑上,带宽的应该没什么上限了,而且发送的都是很少量的数据。
这个只是一个简单的例子测试,仅供参考。

to:elssann()
你前面提到的,socket不用遍历,直接定位的方法,是不是这样做的?

每个socket都回有个唯一的int值,程序中有个足够大的数组可以容纳任何所有值得socket
每次接受连接以后,就设置相应的位置。
这样要定位每个客户端,只要直接用socket的值去索引数组就行了。

加载更多回复(92)

18,356

社区成员

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

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