CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
IBM Rational 系统开发最佳实践工具包 WebSphere MQ 最佳实践 TOP 15
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  网络编程

多线程socket问题

楼主xwffwx(Don't call me chinese)2006-03-13 22:45:57 在 VC/MFC / 网络编程 提问

我想做一个通讯软件,需求是能同时进行多个数据传输任务(任务数理论上不做限制):  
  比如:在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

相关问题

  • 多线程socket!!!
  • Socket的多线程问题
  • 多线程SOCKET的问题!
  • 多线程Socket问题~~
  • socket的多线程问题
  • 多线程 用socket通信
  • 多线程SOCKET通信中的问题
  • 有关多线程和Socket的问题
  • Java中多线程和Socket的问题?
  • 求购(socket)多线程原码,谢谢!

关键词

  • 多线程
  • 文件
  • cpu
  • 数据
  • 线程
  • socket
  • 硬盘
  • sleep
  • 传输
  • 数据包

得分解答快速导航

  • 帖主:xwffwx
  • DentistryDoctor
  • nuaawenlin
  • robin_yao
  • angel_rabbit
  • danscort2000

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo