检测电脑传输时间的问题

xiaohan366 2008-11-18 06:58:26
现在用两个模型在一台电脑上模拟三台电脑传输文件,要检测出来这三台相互传输文件的传输/接收时间。
模型一:电脑1传输文件给电脑2的同时,电脑2只要一接受到文件的部分数据,就开始往电脑3上接收到的文件数据;
模型二:电脑1传输文件给电脑2完了以后,再向电脑3传输相同的文件。
按照理论的设定,模型一的传输时间应该是要少于模型二的传输时间。我在一台电脑上做实验,为什么检测出来的模型二时间少于模型一的时间,而有人用和我相类似的程序做出的数据结论是模型一时间少于模型二? 是我用的算法不够简练,还是一台电脑的内部本身问题?(因为一台电脑模拟出来的网络环境应该可以认为是理想的网络环境)。我认为传输文件的时间大小,应该和所处的网络环境、电脑配置关系更紧密,不知道这样理解对不对,或者说还和什么有紧密的关系?我用插件直接编出来的网络通信程序和用C直接编出来的通信程序,如果设计理念是相同的,传输效率、时间上会有差别吗?
另外想知道是不是如果把传输/接收缓存区buffer设定的越大,理论上的传输速率就越高,时间就越短,如果这样那我能设定最到的最大buffer是多少呢?如果我不设定buffer的值,有没有个直观的方法或者函数检测传输的速度?
问题有点菜,希望大家能详细回答,不甚感激!
...全文
354 59 打赏 收藏 转发到动态 举报
写回复
用AI写文章
59 条回复
切换为时间正序
请发表友善的回复…
发表回复
oyljerry 2008-12-13
  • 打赏
  • 举报
回复
BT文件和Tracker server就是用来实现P2P的方式的途径,如果你能有别的方式,应该也是可以的啊~
只不过对于标准的P2P,你应该用大家通用的方式
xiaohan366 2008-12-13
  • 打赏
  • 举报
回复
[Quote=引用 54 楼 oyljerry 的回复:]
1.P2P就是大家既是客户端也是服务端,既下载也上传~
[/Quote]
达到这个要求的就属于P2P模型,而不用管它具体内部用什么结构?可我的第一个模型里面没有Tracker,也没有用到下载服务器和BT文件
oyljerry 2008-12-13
  • 打赏
  • 举报
回复
1.P2P就是大家既是客户端也是服务端,既下载也上传~
xiaohan366 2008-12-13
  • 打赏
  • 举报
回复
接着上面的问题,希望大虾能回复
模型一在严格意义上算是P2P传输模型吗,还是其他什么模型?
模型二是C/S结构的,但它可以算是CDN模型里的吗?
前面所说的用到阻塞模型要用到多线程,我是可以理解成创建一个socket就代表用到了一个线程吗,即用了几个socket就代表用到了几个线程?
我是不是也可以理解成用到了多线程就代表使用了阻塞模式呢,因为服务器端的listen和accept自身就有阻塞的功能?
xiaohan366 2008-12-13
  • 打赏
  • 举报
回复
[Quote=引用 57 楼 coding_hello 的回复:]
p2p就只是个概念。没规定具体内部结构非要啥样,那是实现的问题。


要想提高效率,从你对上面这些回复的回复来看,你需要搞清楚很多问题。看你用的是VC6,所以OS应该是Windows系统。

首先300M的文件每次读2K,读写的次数是非常多的。磁盘IO是有用户态到内核态的切换开销,很大。所以至少应该注意文件打开时要指定序列化访问来优化。进一步的话,应该使用TransmitFile这种优化过的函数来传输文件。

要高效率的TCP通讯,…
[/Quote]
是在windows下,300M的文件如果每次读取2K,是少了,测试4K的Buffer传输时间是明显少于2K的Buffer传输时间。具体Buffer取多大的值合适,是否有标准?
谢谢您说的这些,要加强的东西是有很多!
xiaohan366 2008-12-13
  • 打赏
  • 举报
回复
[Quote=引用 56 楼 oyljerry 的回复:]
BT文件和Tracker server就是用来实现P2P的方式的途径,如果你能有别的方式,应该也是可以的啊~
只不过对于标准的P2P,你应该用大家通用的方式
[/Quote]
主要是这样编程比较简单,汗~~
野男孩 2008-12-13
  • 打赏
  • 举报
回复
p2p就只是个概念。没规定具体内部结构非要啥样,那是实现的问题。


要想提高效率,从你对上面这些回复的回复来看,你需要搞清楚很多问题。看你用的是VC6,所以OS应该是Windows系统。

首先300M的文件每次读2K,读写的次数是非常多的。磁盘IO是有用户态到内核态的切换开销,很大。所以至少应该注意文件打开时要指定序列化访问来优化。进一步的话,应该使用TransmitFile这种优化过的函数来传输文件。

要高效率的TCP通讯,就要使用高效率的通讯模型。Windows下毫无疑问IOCP的机制是效率最高的。要使用IOCP,多线程的基础是必要的。

MTU是TCP底层的分包方式,跟你的buffer关系不大。

感觉lz要完成高效的机制,要加强的点还很多啊。
cnzdgs 2008-11-30
  • 打赏
  • 举报
回复
我不用各种聊天工具,也不知道GMAIL为何物,E-mail倒是有。
我不喜欢用私聊的方式回答问题,因为帖子中的回复是大家都可以看到的,其他人也可以作为参考,另外如果回答有误,其他人也可以指正。
xiaohan366 2008-11-30
  • 打赏
  • 举报
回复
望穿秋水,朋友我等的花儿也谢了!请不要保持沉默,呵呵
真心实意
ahjoe 2008-11-29
  • 打赏
  • 举报
回复
模式1,使用多线程,阻塞方式。
xiaohan366 2008-11-29
  • 打赏
  • 举报
回复
已另开一贴,关注此帖的人可以继续回答上面一些问题。希望大家能给更好,详细的答案。
另外也可以去这个帖子,帮着回答http://topic.csdn.net/u/20081129/10/f012be4a-e020-433e-a97c-27b0b5421e0d.html
感谢了!
xiaohan366 2008-11-29
  • 打赏
  • 举报
回复
cnzdgs朋友,我可以直接加您QQ或者MSN请教吗,如果没有,别告诉我没有GMAIL.除非不想给,谢谢您一直在关注!
cnzdgs 2008-11-29
  • 打赏
  • 举报
回复
阻塞方式在等待的时候线程就暂停运行了,如果同时还要处理其它任务,需要用多个线程;不阻塞就是一个线程可以同时做很多事,所需线程数量比阻塞方式少,但程序设计也相对复杂一些。
xiaohan366 2008-11-28
  • 打赏
  • 举报
回复
[Quote=引用 45 楼 cnzdgs 的回复:]
可以用阻塞的方式也可以用不阻塞的方式,电脑之间想怎么传都可以,这些问题都是自己设计的时候决定的。
[/Quote]
用阻塞和不用阻塞的好处和不好的有哪些,可以说说吗,另外想主要想做到程序比较优化,尽量能缩短传送时间,基于这个想法,用什么方式比较好?
xiaohan366 2008-11-28
  • 打赏
  • 举报
回复
[Quote=引用 43 楼 cnzdgs 的回复:]
这种做法只是每台电脑需要另外listen一个端口而已,其影响基本是可以忽略不计的。
用UDP如果处理得当,效率会比TCP高,而且比较省资源,但相对要复杂一些,主要是要设计高效的应答和重发机制。
[/Quote]
我这个listen的作用,是使14台电脑产生阻塞状态吗?这样做结果能否控制发送电脑传送文件,先传给电脑1,再传给电脑2,。。。然后依次按规定的顺序传下去。还是发送端随机的给这14台电脑分别传完文件?
cnzdgs 2008-11-28
  • 打赏
  • 举报
回复
可以用阻塞的方式也可以用不阻塞的方式,电脑之间想怎么传都可以,这些问题都是自己设计的时候决定的。
xiaohan366 2008-11-27
  • 打赏
  • 举报
回复
[Quote=引用 35 楼 dch4890164 的回复:]
引用 29 楼 cnzdgs 的回复:
你还是用UDP协议吧,一个socket就可以传多台电脑,而且效率可以比TCP高,在局域网内还可以考虑用广播的形式同时传多台电脑。

恩如果是局域网的话,udp倒是可以考虑
只是需要自己做重发和应答机制
==========================================
不过楼主个人还是建议用tcp
感觉你所说的有些情况下一比二慢,应当还是你的算法结构没有优化吧
[/Quote]
是要把两个都要做到最优或者尽量优化,这样测得的数据才具有可比性?或者说具有意义?
现在是要在一个局域网模拟的广域网环境下测试数据,这样我测试用多大的文件比较好,主要是没有一个具体的标准。
cnzdgs 2008-11-27
  • 打赏
  • 举报
回复
这种做法只是每台电脑需要另外listen一个端口而已,其影响基本是可以忽略不计的。
用UDP如果处理得当,效率会比TCP高,而且比较省资源,但相对要复杂一些,主要是要设计高效的应答和重发机制。
xiaohan366 2008-11-27
  • 打赏
  • 举报
回复
模型二现在情况是这样的,一台发送端,要分别给14台电脑传送相同的文件,要求先给一台电脑传完文件以后才能给下一台传送。按照正常情况,我发送文件,就把发送端作为TCP协议里的客户机,其他14台电脑接收文件,就作为TCP协议里的服务端。在客户机里分别创建14个socket,然后在每个socket的accept阶段又生成14个socket,这样效率太低,因为我是始终读取、发送一个文件。所以就有了上面那个想法
[Quote=引用 40 楼 xiaohan366 的回复:]
谢谢上面三位朋友帮着顶。
现在有另外一个想法,针对模型二:我想把发送的那台电脑作为服务器,其他等待依次接收文件的电脑作为客户端。我现在怎么设置这些客户端为同时打开的等待接受状态?它没有像服务端那样的listen和accept等待延迟函数,我只要一运行一个客户端,它就自己提示无法连接,像这样的情况怎么设置呢?
[/Quote]
如果这样做,我就只需创建一个socket,效率应该要好些。这样做可以吗?
另外,用UDP实现模型二,除了容易丢失包,效率上是不是可能要更好些呢?实现上也更容易?
xiaohan366 2008-11-27
  • 打赏
  • 举报
回复
模型二现在情况是这样的,一台发送端,要分别给14台电脑传送相同的文件,要求先给一台电脑传完文件以后才能给下一台传送。按照正常情况,我发送文件,就把发送端作为TCP协议里的客户机,其他14台电脑接收文件,就作为TCP协议里的服务端。在客户机里分别创建14个socket,然后在每个socket的accept阶段又生成14个socket,这样效率太低,因为我是始终读取、发送一个文件。所以就有了上面那个想法
[Quote=引用 40 楼 xiaohan366 的回复:]
谢谢上面三位朋友帮着顶。
现在有另外一个想法,针对模型二:我想把发送的那台电脑作为服务器,其他等待依次接收文件的电脑作为客户端。我现在怎么设置这些客户端为同时打开的等待接受状态?它没有像服务端那样的listen和accept等待延迟函数,我只要一运行一个客户端,它就自己提示无法连接,像这样的情况怎么设置呢?
[/Quote]
如果这样做,我就只需创建一个socket,效率应该要好些。这样做可以吗?
另外,用UDP实现模型二,除了容易丢失包,效率上是不是可能要更好些呢?实现上也更容易?
加载更多回复(39)

18,356

社区成员

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

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