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()相减。