多线程socket问题
我想做一个通讯软件,需求是能同时进行多个数据传输任务(任务数理论上不做限制):
比如:在A向B发送文件的同时,也允许B向A传输文件,等等
我的想法是:
1 要么AB之间建立多个socket,每个scoket处理一个任务
2 要么AB之间只建立一个socket,用互斥方法共享socket进行收发
大家建议用那种方案?还有没有更好的方法?
请有经验的朋友帮忙分析一下
目前我采用了方案2,即共享socket,
在发送数据时,在数据包头部上加一个任务id,
接收方根据任务id进行数据的分发处理
但是有这样一个问题:
我发现socket在发送数据时会把数据包拆开,
这样导致接收方无法从碎包中得到正确的任务id,因而不能正确处理数据
有办法可以解决吗?
问题点数:50、回复次数:13Top
1 楼DentistryDoctor(不在无聊中无奈,就在沉默中变态)回复于 2006-03-13 22:50:34 得分 15
任务数理论上不做限制?应该考虑IOCP
www.codeproject.com/internetTop
2 楼xwffwx(Don't call me chinese)回复于 2006-03-13 23:05:01 得分 0
任务数理论上不做限制,这句话可能有点夸张,
一对通讯站点之间不会超过10个同时进行的传输任务
Top
3 楼nuaawenlin(飘人)回复于 2006-03-14 09:48:18 得分 5
多个socket同时传送效率高一些
不过要处理数据的先后问题Top
4 楼xwffwx(Don't call me chinese)回复于 2006-03-14 16:54:20 得分 0
多个socket同时传送效率高一些
----------------------------
我现在已经实现并通过了方案2,
在本机开两个程序互传,
传输10个64M的文件用了150秒
如果直接本地复制/粘贴则只花了27秒
慢了5倍多
最先我把数据包设置为1k,但发现速度很慢
于是把数据包为10k,速度是上来了
但有没有什么问题?
因为我看好多程序的数据包只有1-2k左右
Top
5 楼xwffwx(Don't call me chinese)回复于 2006-03-14 16:57:14 得分 0
传输时cpu在13%左右
复制/粘贴时cpu在29%左右
Top
6 楼xwffwx(Don't call me chinese)回复于 2006-04-20 21:25:05 得分 0
再来几个人看看,准备结帖了Top
7 楼robin_yao()回复于 2006-04-20 21:51:11 得分 5
IOCP。大批量数据应该用到UDP了吧。Top
8 楼robin_yao()回复于 2006-04-20 21:51:31 得分 0
楼主用TCP?Top
9 楼angel_rabbit(zj_rabbit)回复于 2006-04-20 22:21:14 得分 5
mark...Top
10 楼xwffwx(Don't call me chinese)回复于 2006-04-21 09:09:01 得分 0
楼主用TCP?
----------
是的,因为以后可能往linux方面转
不想使用一些windows的专有技术(如重叠IO和完成端口)
目前做的情况是
能在多传输任务中共享一个socket进行收发
而且在服务器端只用一个线程处理每个连接
速度也还可以
在本机器做测试时(同时开服务器和客户端)
传输一个440M的文件,用了40秒左右
本地复制/粘贴该文件需要约20秒
同时传20个17M的文件,每个任务完成时间在4秒-15秒内
现在的问题是
在发送数据时,对cpu占用达到了100%(不发送数据则基本不消耗cpu)
在程序内部使用select监视socket的状态
在接收线程中,为select设置了1秒的等待延时
在发送线程中,为select设置延时为0(改成1秒对cpu占用也是100%)
想了好几天,也没想好如何降低cpu消耗的同时仍保持目前的传输速度
这之前的一个版本是用多线程,每个线程处理一个连接
对cpu消耗很低,速度要比现在慢一些
不行的话,还是用多线程实现算了
Top
11 楼danscort2000(danscort.yu)回复于 2006-04-21 09:44:30 得分 20
本地传输慢的原因在于你的网络地址被指定为外网了
也就是被强制到交换或者路由上跑了个圈子
如果指定127的话,
我测试过,
平均在22M/S 左右,可以保持
而如果采用的是外网,
由于你的网络不过100MBPS,也就是通常8M/S左右MAX
所以慢
多线程使用SOCKET,使用SELECT为0,则应该与SLEEP配合使用
如果指定为1秒,则直接使用不用SLEEP,
CPU消耗的主要部分在磁盘的IO上,而不是线程里的SEND或者RECV函数上
你并发发送20个文件,CPU 100%是正常的,当然是针对 IDE硬盘,SCSI硬盘不一样
一个IDE硬盘在同时大流量读写文件的时候,大概在11-12个这样就已经满了,CPU占用100%
其中写文件的CPU占用大概是读文件的1.5倍
如果有疑问,可以调用监控函数,看看读文件,写文件,SEND包,RECV包,分别开销了多少CPU
Top
12 楼danscort2000(danscort.yu)回复于 2006-04-21 09:47:39 得分 0
如果不想使用多线程
你可以使用非阻塞
,然后使用IOCTL来轮循检查并发送数据
记得要和SLEEP合用,否则CPU占用会虚高
Top
13 楼xwffwx(Don't call me chinese)回复于 2006-04-25 08:52:20 得分 0
谢谢关注,结帐Top




