找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 17090|回复: 59

proactor传文件的测试

[复制链接]
发表于 2009-10-19 15:09:30 | 显示全部楼层 |阅读模式
测试的是服务器的发送时间
文件大小    100k          2m            10m
连接数

100          94ms         390ms        1453ms


200          78ms         703ms           30000ms左右

500          219ms       2329ms         内存不足


问题1:为什么在连接数为200,大小10m的时候时间跨度如此大。是不是有类似于瓶颈之类的问题?
问题2:在服务器端为什么会出现内存不足的提示。

需要哪些地方的代码?我再贴出来
 楼主| 发表于 2009-10-20 10:11:41 | 显示全部楼层
我的电脑内存2G的,
在发送的文件大小*连接数<<内存的情况下,发送都是很高效的。

是不是我的程序在发送时申请的内存没有释放?还是别的原因。

传100k的文件,几千的连接都没有问题。

大神们,来看下。

这是发送的函数
void CPserverDlg::OnFileSend()
{
// TODO: Add your control notification handler code here
CString str;
sendFile.Abort();
    sendFile.Open(sendFileName,CFile::modeRead  | CFile::typeBinary);
sendFileLen = sendFile.GetLength();
CPserverDlg *dlg = (CPserverDlg*)AfxGetApp()->GetMainWnd();
str.Format("%d",sendFileLen);
dlg->MessageBox(str);
SYSTEMTIME time1;
    GetSystemTime(&time1);
int size=8100;
while(sendFileLen>size)
{
  char *membuf=new char[size+2] ;
  sendFile.Read(membuf,size);
  membuf[size] = '%';
  membuf[size+1] = '\0';
  list <HA_Proactive_Service *> ::iterator its;
  for(its=HA_Proactive_Service::List.begin();its!=HA_Proactive_Service::List.end();its++)
  {
   HA_Proactive_Service *curSvr = *its;
   curSvr->WriteDate(membuf,size+1);
  }
  sendFileLen = sendFileLen-size;
  delete []membuf;
  membuf=null;
}
    CHAR *membuf = new CHAR[sendFileLen+2];
sendFile.Read(membuf,sendFileLen);
sendFile.Close();
membuf[sendFileLen] = '^';
membuf[sendFileLen+1] = '\0';
list <HA_Proactive_Service *> ::iterator its;
for(its=HA_Proactive_Service::List.begin();its!=HA_Proactive_Service::List.end();its++)
{
  HA_Proactive_Service *curSvr = *its;
  curSvr->WriteDate(membuf,sendFileLen+1);
}
SYSTEMTIME time2;
    GetSystemTime(&time2);
str.Format("文件已发送,耗时%d毫秒",time2.wMinute*60*1000+time2.wSecond*1000+time2.wMilliseconds
  -(time1.wMinute*60*1000+time1.wSecond*1000+time1.wMilliseconds));
MessageBox(str);
delete []membuf;
membuf=null;
}

int WriteDate(char *szSendBuf, int nSendCnt)
{
  ACE_Message_Block *smb = new ACE_Message_Block(nSendCnt+1);
  smb->copy(szSendBuf,nSendCnt+1);      
  int nResult = this->writer_.write(*smb,nSendCnt+1);
  if ( nResult != 0)
  {
   ACE_TRACE("Write data failed!");
  }
  
  return nResult;
}

[ 本帖最后由 psycheqiqi 于 2009-10-20 14:09 编辑 ]
 楼主| 发表于 2009-10-20 14:53:58 | 显示全部楼层
怎么这两天没人啊
modern wiston你们都去哪了?
 楼主| 发表于 2009-10-20 16:17:45 | 显示全部楼层
问题3:
在发送9.2M的文件的时候,连接数<=16时可以正确的发送,但当连接数>16时则不能正确的接受,只收到很少的数据。
发表于 2009-10-20 16:44:12 | 显示全部楼层
错误信息是什么?
走到ACE_TRACE("Write data failed!");这个分支里面了么?
 楼主| 发表于 2009-10-21 09:58:03 | 显示全部楼层

回复 #5 modern 的帖子

在发9.2M文件连接超过17个的时候程序跳到了
ACE_TRACE("Write data failed!");里
我怎么知道错误信息和错误代码
 楼主| 发表于 2009-10-21 10:56:23 | 显示全部楼层

回复 #6 psycheqiqi 的帖子

modern,帮我看下。
是write()没有成功,但为什么会有个数限制。
我实在想不通哪错了
发表于 2009-10-21 11:11:10 | 显示全部楼层
走到那里就对了。
你的程序问题比较多,主要原因是因为你对IOCP的机制以及Socket基础知识了解得不够深刻。
1.socket缓冲区是有大小限制的,即便你把他调到最大,就算异步I/O性能再高,
你几兆的文件往里面不停的写,早晚肯定会缓冲区溢出的。
2.一定要理解一件事情,write成功只是说明把数据写到缓冲区中了,而不是发到对端。
楼主测试这个发送时间的意义有多大,希望楼主再仔细考虑一下。
3.我记得楼主上次有问过ACE使用Proactor异步传文件的例子,
看样子楼主对里面的逻辑还是没有理解透,建议楼主再仔细研究一下。
 楼主| 发表于 2009-10-21 11:25:18 | 显示全部楼层

回复 #8 modern 的帖子

1:就是说在多连接时发送几M的文件,缓冲区肯定会溢出。
     既然缓冲区的太小是一定的,是不是可以分批次来发送。
     
     给个思路....
   
2:我想测试的是发送+传输+接受的时间,中间有交互的处理会占用时间所以我考虑分开来测。
     这个我会再考虑。
发表于 2009-10-21 12:38:06 | 显示全部楼层
纠正一下,
不是多连接传几M的文件缓冲区肯定会溢出。
而是按照楼主的处理逻辑,才肯定会溢出。
思路我已经说过了,见3。
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-12-23 13:55 , Processed in 0.027777 second(s), 5 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表