windows socket编程中,recv()函数的耗时问题?

big 2013-03-25 05:10:12
我用windows socket编程从FTP服务器上多线程读取多个文件到本地内存(注:这里每个线程读取指定的多个文件,如某个线程指定读取文件名为test00-test99的jpg文件),每个线程函数的基本过程有:

1、客户端创建套接字sockCmd,填充服务器端ip、21号端口和AF_INET协议族;
connect()连接服务器,recv(sockCmd)接收连接成功的相关信息;
send(sockCmd)向服务器发送“USER anonymous\r\n”命令,recv()接收允许匿名登陆输入密码的相
关信息;
send(sockCmd)向服务器发送“PASS\r\n”命令,recv()接收匿名登陆成功的相关信息;
FTP命令传输通道创建成功。
2、for(test00-test99),一个大循环,读取指定的多个文件(test00-test99的jpg文件)。

在读取某一个文件时:
3、send(sockCmd)向服务器发送“PASV\r\n”命令,recv(sockCmd)获取服务器提供客户端进行数据传输
通道连接的端口port;
客户端创建套接字sockData,填充服务器端ip、新端口port和AF_INET协议族;
connect()连接服务器。
4、send(sockCmd)向服务器发送“TYPE I\r\n”命令,将数据传输模式设置成二进制传输方式;
recv(sockCmd)接收设置传输方式成功的相关信息。
5、send(sockCmd)向服务器发送“RETR test00.jpg”命令,选择文件,启动下载;
recv(sockCmd)接收文件开始下载的相关信息。
6、do{
readSize = recv(sockData, buf, sizeof(buf), 0);
}while(readSize) //读取文件。
7、closesocket(sockData);
recv(sockCmd)接收某个文件读取完成的相关信息。

当所有文件(test00-test99)都读取完毕时:
8、send(sockCmd)向服务器发送“QUIT\r\n”命令;
recv(sockCmd)接收与服务器成功断开连接的相关信息;
closesocket(sockCmd)。

在用于接收数据的buffer[]的大小足够都为512字节的前提下,我现在的问题是:

为什么在第7步recv()接收某个文件读取成功信息的耗时总是大于其他步骤里recv()接收信息的耗时?这里第7步recv()接收的字符串数据也并非最长,其他步骤里的recv()耗时几乎为0,而第7步recv()则需要0.1秒,这样的话,如果我读取1000个文件,岂不是都把时间耗在第7步的recv()上了,耗时的计算我用的是recv()前后clock()相减。

...全文
446 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
无言猪 2013-03-26
  • 打赏
  • 举报
回复
引用 3 楼 lostying 的回复:
引用 2 楼 oqqbig12 的回复:引用 1 楼 lostying 的回复:这个得看FTP服务器怎么处理的了,毕竟你recv不到消息不在于你,而在于对方不发. 你的意思是我之所以在某个recv花了很多时间,是因为当时recv在等待服务器发消息? 如果你的程序本身占用CPU不高,recv的耗时就是在等待对方数据上了.
目前看来是没法的,网络本身就是不可控的,除非两端都是你写的.
big 2013-03-26
  • 打赏
  • 举报
回复
引用 3 楼 lostying 的回复:
引用 2 楼 oqqbig12 的回复: 引用 1 楼 lostying 的回复:这个得看FTP服务器怎么处理的了,毕竟你recv不到消息不在于你,而在于对方不发. 你的意思是我之所以在某个recv花了很多时间,是因为当时recv在等待服务器发消息? 如果你的程序本身占用CPU不高,recv的耗时就是在等待对方数据上了.
我现在想怎么能让这个耗时过多的recv和其他recv一样达到耗时几乎为0,那么是不是就没有办法了,服务器端的处理我无法改变和控制。这里服务器端我用的是IIS搭建FTP站点。
无言猪 2013-03-26
  • 打赏
  • 举报
回复
引用 2 楼 oqqbig12 的回复:
引用 1 楼 lostying 的回复:这个得看FTP服务器怎么处理的了,毕竟你recv不到消息不在于你,而在于对方不发. 你的意思是我之所以在某个recv花了很多时间,是因为当时recv在等待服务器发消息?
如果你的程序本身占用CPU不高,recv的耗时就是在等待对方数据上了.
big 2013-03-26
  • 打赏
  • 举报
回复
引用 1 楼 lostying 的回复:
这个得看FTP服务器怎么处理的了,毕竟你recv不到消息不在于你,而在于对方不发.
你的意思是我之所以在某个recv花了很多时间,是因为当时recv在等待服务器发消息?
smwhotjay 2013-03-26
  • 打赏
  • 举报
回复
你需要异步了.
danscort2000 2013-03-26
  • 打赏
  • 举报
回复
用select判断是否有数据 没数据就跳过 等下个循环 直接 recv 那不就阻塞在那里等数据了吗
无言猪 2013-03-25
  • 打赏
  • 举报
回复
这个得看FTP服务器怎么处理的了,毕竟你recv不到消息不在于你,而在于对方不发.

18,363

社区成员

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

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