内网socket传输相关

huang_M 2014-11-10 10:12:16
我最近在搞一个文件下载的服务端。文件大小估计在40M左右。使用自定义的文件传输协议。
单独文件传输,不是采用拆分文件,分包发送的方法。而是一问一答顺序传输文件。流程如下:
第一步,客户端请求服务端下载文件;
服务端接收到请求,发送文件第一个1KB大小(自定义协议规定最大只能传这么大,包头中,会有文件总大小信息)
第二步、客户端接收到文件数据,判断文件是否全部接收完,没,则继续请求
服务端接收到请求,再此发送下一个1KB
如上循环,直到全部发送完毕。
现在的问题是:发送的速度太慢。
我想知道,如果采用这种方式,最大的传输速度多少?本人的传输速度才4KB每秒。

...全文
180 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
huang_M 2014-11-17
  • 打赏
  • 举报
回复
谢谢大家的帮助,给我提供了方向。我按照大家的建议,我自己写了一个通讯库,测试了下,单个文件传输能道道600KB\S,多个文件传输,总体速度还更快。原因出在同事的通讯库上,具体原因,我也不知道,我看不到他代码。这几天一直在研究完成端口和怎么写库程序,终于搞定了。 谢谢大伙,感谢,支持CSDN。
  • 打赏
  • 举报
回复
用TransmiteFile函数直接传输整个文件(不超过2GB)
huang_M 2014-11-11
  • 打赏
  • 举报
回复
引用 13 楼 xihu1364 的回复:
用心跳检查服务器是否在线?..................................你的意思客户端发了心跳,服务器还回复?这挺消耗服务器的性能的
是的,定时发送心跳。这个服务器,不是那种很多客户同时连接的服务器。但是,传输文件时,会有有很多的网络传输。
huang_M 2014-11-10
  • 打赏
  • 举报
回复
谢谢 版主大哥。 我现在就用自己的Send试一试。他的库,做了限制。异步的不好做,协议规定死了,必须是一问一答的方式去传输数据了。 我是个新人,经理,同事他们都是比我经验足,我也不好说什么。
版主大哥 2014-11-10
  • 打赏
  • 举报
回复
引用 6 楼 u012632563 的回复:
[quote=引用 5 楼 jzycode 的回复:] 局域网的带宽都是几百兆,你一次就传1KB?你可真够吝啬的
不是我吝啬,是制定协议的人吝啬。 我使用的是另一个同事开发的通讯库,该通讯库还对数据包大小做了限制,不超过2KB(包括包头和数据); 该通讯库是使用完成端口技术。
引用 2 楼 xihu1364 的回复:
速度的原因就是每次io的大小 解决方法: 1.将包弄大,比如8k,16k 2.send 包的时候,不调用send,而是将包push到一个比较大的buf中,用1个线程每个10毫秒扫描较大的buf是否有数据,有就send(比如可以当buf中数据达到多少时发送,和过了多少时间后,不管数据多少都发送等等算法)。这样的目的就是减少send的次数,也就是减少IO操作
你说的在理。但当我除掉IO操作后,只是进行简单的一问一答时,最大的通讯次数也就20次每秒左右。[/quote] 这跟次数没关系吧,TCP是流式 发送有最大带宽 你使用别人写的iocp库,他的WSASend只发送1024? 这样的话,你还发送后,那边应答,然后再发,这样肯定慢。 你就使用异步的被,这边一直发,而不是等到那边应答再发...(这样应该会快点,但是不是实质的) 你可以不用他的WSAsend接口,你直接调用send试试
huang_M 2014-11-10
  • 打赏
  • 举报
回复
引用 5 楼 jzycode 的回复:
局域网的带宽都是几百兆,你一次就传1KB?你可真够吝啬的
不是我吝啬,是制定协议的人吝啬。 我使用的是另一个同事开发的通讯库,该通讯库还对数据包大小做了限制,不超过2KB(包括包头和数据); 该通讯库是使用完成端口技术。
引用 2 楼 xihu1364 的回复:
速度的原因就是每次io的大小 解决方法: 1.将包弄大,比如8k,16k 2.send 包的时候,不调用send,而是将包push到一个比较大的buf中,用1个线程每个10毫秒扫描较大的buf是否有数据,有就send(比如可以当buf中数据达到多少时发送,和过了多少时间后,不管数据多少都发送等等算法)。这样的目的就是减少send的次数,也就是减少IO操作
你说的在理。但当我除掉IO操作后,只是进行简单的一问一答时,最大的通讯次数也就20次每秒左右。
_船长_ 2014-11-10
  • 打赏
  • 举报
回复
局域网的带宽都是几百兆,你一次就传1KB?你可真够吝啬的
bluesen 2014-11-10
  • 打赏
  • 举报
回复
引用 2 楼 xihu1364 的回复:
速度的原因就是每次io的大小 解决方法: 1.将包弄大,比如8k,16k 2.send 包的时候,不调用send,而是将包push到一个比较大的buf中,用1个线程每个10毫秒扫描较大的buf是否有数据,有就send(比如可以当buf中数据达到多少时发送,和过了多少时间后,不管数据多少都发送等等算法)。这样的目的就是减少send的次数,也就是减少IO操作
对,把包弄大会快很多。
版主大哥 2014-11-10
  • 打赏
  • 举报
回复
楼主的速度也太慢了 我记得我的包为8k的时候外网传输都有180Kb/s左右的速度 换成2的方法,速度就达到最大带宽了,最高能达到2-4M/s
版主大哥 2014-11-10
  • 打赏
  • 举报
回复
速度的原因就是每次io的大小 解决方法: 1.将包弄大,比如8k,16k 2.send 包的时候,不调用send,而是将包push到一个比较大的buf中,用1个线程每个10毫秒扫描较大的buf是否有数据,有就send(比如可以当buf中数据达到多少时发送,和过了多少时间后,不管数据多少都发送等等算法)。这样的目的就是减少send的次数,也就是减少IO操作
huang_M 2014-11-10
  • 打赏
  • 举报
回复
如果我除掉,程序本身对数据的处理,只是单纯一问一答的传输,最大速度也才20次每秒
版主大哥 2014-11-10
  • 打赏
  • 举报
回复
直接send成功就在线 send不成功就不在线撒..
版主大哥 2014-11-10
  • 打赏
  • 举报
回复
用心跳检查服务器是否在线?..................................你的意思客户端发了心跳,服务器还回复?这挺消耗服务器的性能的
huang_M 2014-11-10
  • 打赏
  • 举报
回复
引用 9 楼 xian_wwq 的回复:
[quote=引用 楼主 u012632563 的回复:] 我最近在搞一个文件下载的服务端。文件大小估计在40M左右。使用自定义的文件传输协议。 单独文件传输,不是采用拆分文件,分包发送的方法。而是一问一答顺序传输文件。流程如下: 第一步,客户端请求服务端下载文件; 服务端接收到请求,发送文件第一个1KB大小(自定义协议规定最大只能传这么大,包头中,会有文件总大小信息) 第二步、客户端接收到文件数据,判断文件是否全部接收完,没,则继续请求 服务端接收到请求,再此发送下一个1KB 如上循环,直到全部发送完毕。 现在的问题是:发送的速度太慢。 我想知道,如果采用这种方式,最大的传输速度多少?本人的传输速度才4KB每秒。
这样子设计估计是为了应对公网链路不稳定的情况[/quote] 估计不是,如果客户端发送请求后,服务端无响应,那就是一个无效操作,后面只用靠心跳去检查服务端是否在线。
huang_M 2014-11-10
  • 打赏
  • 举报
回复
引用 10 楼 wxhxj0268 的回复:
[quote=引用 1 楼 u012632563 的回复:] 如果我除掉,程序本身对数据的处理,只是单纯一问一答的传输,最大速度也才20次每秒
一次1K,20次也有20K / 秒,处理过程应该在ms级,若4K / 秒应该存在未发现的其它问题。[/quote] 恩,那个20次是不加载任何数据的情况下,当使用1KB数据时(随便什么数据),速度就降下来了。通讯库是DLL,我看不到。 现在我在自己写通讯库,试一试。
笨笨仔 2014-11-10
  • 打赏
  • 举报
回复
引用 1 楼 u012632563 的回复:
如果我除掉,程序本身对数据的处理,只是单纯一问一答的传输,最大速度也才20次每秒
一次1K,20次也有20K / 秒,处理过程应该在ms级,若4K / 秒应该存在未发现的其它问题。
xian_wwq 2014-11-10
  • 打赏
  • 举报
回复
引用 楼主 u012632563 的回复:
我最近在搞一个文件下载的服务端。文件大小估计在40M左右。使用自定义的文件传输协议。 单独文件传输,不是采用拆分文件,分包发送的方法。而是一问一答顺序传输文件。流程如下: 第一步,客户端请求服务端下载文件; 服务端接收到请求,发送文件第一个1KB大小(自定义协议规定最大只能传这么大,包头中,会有文件总大小信息) 第二步、客户端接收到文件数据,判断文件是否全部接收完,没,则继续请求 服务端接收到请求,再此发送下一个1KB 如上循环,直到全部发送完毕。 现在的问题是:发送的速度太慢。 我想知道,如果采用这种方式,最大的传输速度多少?本人的传输速度才4KB每秒。
这样子设计估计是为了应对公网链路不稳定的情况
.支持联系人状态(在线、离开、离线、忙碌、电话、会议…) .支持会话 .支持邀请多人会话 .支持表情图标 .支持字体与颜色 .支持截图发送 .支持点对点文件发送(Internet上平均传输文件为60KB/秒) .支持点对点文件断点续传 .支持语音交流 .支持视频交流 .查找好友 .显示商务好友信息 .支持消息广播 .留言消息提醒,对方不在线情况下可以留言,对方上线时得到留言提醒 .自定义群组 .自定义个人档案信息 .支持多人语音视频会议 .支持服务器Linux\Win2000\2003\2008 历史信息管理 通讯记录,查看历史聊天记录和文件发送接收记录 短信中心 1)一对一手机短信发送(中国移动、中国联通手机) 2)手机短信群发(中国移动、中国联通手机) Web客户端 内嵌Web网页浏览 语言版本 1)支持简体中文操作界面,包括客户端和服务端 2)支持英文操作界面,包括客户端和服务端 应用领域: 1. 高稳定性,高负载大用户量在线即时通信环境。 2. 面向高端商务,商贸,音乐娱乐各行业门户网站。 3. P2P 互动游戏数据交换. 4. 已有会员整合,"一站式" 服务应用领域。 5. 远程教学,医疗咨询,企业文件传输与管理,视频监控,网络电话等应用。 6. 和企业已有软件项目结合(ERP\CRM\SCM) 已经使用的企业: 上海XXX多媒体技术有限公司、上海XX传媒广告有限、上海XXX网络科技有限公司、青岛XXX软件科技有限公司、外X网、上海XXX服饰有限公司、 广州X打折网 、广州X下载网、北京X房产网、北京X龙旅游信息技术有限公司、北京X网络有限公司... 通讯协议: 1)底层通讯基于TCP/IP协议。 2)文件传输基于UDP协议。Internet中传输文件速度与QQ相当,内网传输文件最快,比QQ快点。 3)客户端之间消息交换基于P2P技术(点对点) 4)应用网络地址转换(NAT)技术,局域网和Internet之间自由通讯. 5)穿透防火墙技术. [找出目标进程] [找出SOCKET句柄] [用DuplicateHandle()函数将其SOCKET转换为能被自己使用] [用转换后的SOCKET进行数据传输] 6)支持邮件接受和发送协议(PoP3/STMP)提供邮件接口,可以在系统内集成邮件系统 开发环境 1)纯VC++、c、Delphi、C#编写 2)支持SQL Server 2000/2005/2008、Oracle9i/10i/MySql数据库 3)服务器系统支持Linux\BSD\Unix\Windows2000\2003\2008 服务器并发说明: 服务端主要用于用户基本信息、在线状态、组织结构的信息保存。 不参与客户之间的信息交换(类似BT),服务器可以为分布式集群,如果数据库为SQL SERVER 2000以上版本可以使用故障转移(负载均衡)大大增强服务端的并发和负载,服务端用户登录数并发为1秒300。 服务器负载说明: 注册用户数量设计上是没有限制的,单服务器情况下允许同时在线用户100000以上。

18,356

社区成员

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

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