CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  ATL/ActiveX/COM

COM组件运行速度问题

楼主mycode(不写代码)2000-12-24 21:17:00 在 VC/MFC / ATL/ActiveX/COM 提问

我做了一个普通程序和一个组件,用来查询域名信息用的.结果是普通程序只需2秒就可以,组件程序用了30秒以上,还经常不能查询出结果来.  
  普通程序代码如下:  
  #include   "stdafx.h"  
  #include   <stdlib.h>  
  #include   <winsock.h>  
   
  int   main(int   argc,   char*   argv[])  
  {  
  SOCKET   sock;  
  struct   sockaddr_in   server;  
  struct   hostent   *hp;  
  char   buf[1025];  
  WORD   wVersion;  
  WSADATA   wsaData;  
  int   err;  
  int   iRecv;  
  char   domain[1024];  
   
  if   (argc<2){  
  printf("Use   \n   CsWhois     DomainName\n\n");  
  return   0;  
  }  
  strcpy(domain,argv[1]);  
  strcat(domain,"\n");  
  wVersion   =   MAKEWORD(2,0);     //版本号  
  err=WSAStartup(wVersion,&wsaData);   //初始化  
  sock   =   socket(AF_INET,SOCK_STREAM,0);   //定义一个Socket  
  if(sock<0){   //出错处理  
  perror("opening   stream   socket");  
  return   1;  
  }  
  server.sin_family   =   AF_INET;  
  hp   =   gethostbyname("whois.networksolutions.com");  
  if   (hp==0){  
  fprintf(stderr,"%s   Unknow   host   \n",argv[1]);  
  return   2;  
  }  
  memcpy((char   *)&server.sin_addr,(char   *)hp->h_addr   ,hp->h_length);//构造服务器地址  
  server.sin_port=htons(43);   //构造服务器端口  
  if   (connect(sock,(struct   sockaddr   *)&server,sizeof(server))<0){   //连接  
  perror("connect   stream   socket!");  
  return   3;  
  }  
  if   (send(sock,domain,lstrlen(domain),MSG_DONTROUTE)<0){//发送  
  perror("sending   on   stream   socket!");  
  return   4;  
  }  
   
  iRecv=recv(sock,buf,1024,0);//接收  
  while(iRecv>0){  
  buf[iRecv]='\0';  
  printf("%s\n",buf);  
  iRecv=recv(sock,buf,1024,0);  
  if(   iRecv==   SOCKET_ERROR)   {  
  break;  
  }  
  }  
  closesocket(sock);//关闭  
  WSACleanup();//清除  
  return   0;  
  }  
   
  COM组件代码:  
  STDMETHODIMP   CWhoIs::QueryDomain(BSTR   DomainName,   BSTR   *   pVal)  
  {  
  //   TODO:   Add   your   implementation   code   here  
  WriteLogFile("Query   Start!");  
  USES_CONVERSION;  
  SOCKET   sock;  
  struct   sockaddr_in   server;  
  struct   hostent   *hp;  
  TCHAR   buf[1025];  
  WORD   wVersion;  
  WSADATA   wsaData;  
  int   err;  
  int   iRecv;  
  LPTSTR   domain;  
  TCHAR   *tcBuf;  
   
  domain   =   W2A(DomainName);  
  lstrcat(domain,_T("\n"));  
  wVersion   =   MAKEWORD(2,0);     //版本号  
  err=WSAStartup(wVersion,&wsaData);   //初始化  
  sock   =   socket(AF_INET,SOCK_STREAM,0);   //定义一个Socket  
  if(sock<0){   //出错处理  
  m_ErrorMsg   =   BSTR("Create   Socket   Error!");  
  return   S_FALSE;  
  }  
  server.sin_family   =   AF_INET;  
  WriteLogFile("Init!");  
  hp   =   gethostbyname("whois.networksolutions.com");  
  WriteLogFile("gethostbyname!");  
  if   (hp==0){  
  m_ErrorMsg   =   BSTR("Can   Not   Find   whois.networksolutions.com!");  
  closesocket(sock);//关闭  
  WSACleanup();//清除  
  return   S_FALSE;  
  }  
  memcpy((char   *)&server.sin_addr,(char   *)hp->h_addr,hp->h_length);//构造服务器地址  
  server.sin_port=htons(43);   //构造服务器端口  
  WriteLogFile("Connect   Start!");  
  if   (connect(sock,(struct   sockaddr   *)&server,sizeof(server))<0){   //连接  
  m_ErrorMsg   =   BSTR("Can   Not   Connect   whois.networksolutions.com!");  
  closesocket(sock);//关闭  
  WSACleanup();//清除  
  return   S_FALSE;  
  }  
  WriteLogFile("Connect   End!");  
  if   (send(sock,domain,lstrlen(domain),MSG_OOB)<0){//发送  
  m_ErrorMsg   =   BSTR("Sending   Error!");  
  closesocket(sock);//关闭  
  WSACleanup();//清除  
  return   S_FALSE;  
  }  
  WriteLogFile("Send   End!");  
  tcBuf=(TCHAR   *)malloc(10   *   sizeof(TCHAR));  
  lstrcpy(tcBuf,_T(""));  
  WriteLogFile("Receive   start!");  
  iRecv=recv(sock,buf,1024,0);//接收  
  WriteLogFile("Receive   End!");  
  if   (iRecv<=0)   {  
  int   i;  
  char   buffer[20];  
  i   =   WSAGetLastError   ();  
  _itoa(   i,   buffer,   10   );  
  WriteLogFile(buffer);  
  }  
  while(iRecv>0){  
  WriteLogFile("Loop   start!");  
  buf[iRecv]='\0';  
  tcBuf   =   (TCHAR   *)realloc(tcBuf,sizeof(TCHAR)*(lstrlen(buf)+lstrlen(tcBuf)+10));  
  WriteLogFile("realloc!");  
  if   (tcBuf==NULL){  
  free(tcBuf);  
  closesocket(sock);  
  WSACleanup();  
  WriteLogFile("Fail!");  
  return   S_FALSE;  
  }  
  lstrcat(tcBuf,buf);  
  WriteLogFile("receive   start!");  
  iRecv=recv(sock,buf,1024,0);  
  WriteLogFile("receive   end!");  
  if(   iRecv==   SOCKET_ERROR)   {  
  m_ErrorMsg   =   BSTR("Receiv   Error!");  
  break;  
  }  
  }  
  WriteLogFile("Receive   Finish!");  
  closesocket(sock);//关闭  
  WSACleanup();//清除  
  *   pVal=::SysAllocString(T2OLE(tcBuf));  
  free(tcBuf);  
  WriteLogFile("Query   End!");  
  return   S_OK;  
  }  
   
  其中:WriteLogFile()函数是我用来跟踪用的.发现速度最慢的语句是  
  iRecv=recv(sock,buf,1024,0);  
  实在是奇怪.  
   
  我的可用分有1000多分,为什么只能最高给出50分?大家也顺便回答一下. 问题点数:50、回复次数:4Top

1 楼lhxx(随风)回复于 2000-12-25 16:12:00 得分 25

不太清楚,不过COM组件一般比同样功能的应用程序慢,因为要进行一些合法性检查...  
  Top

2 楼javabeans(爪哇豆)回复于 2000-12-27 10:35:00 得分 25

第一次确实很慢  
  但以后应该快多了  
  可以减少到原来的一半左右  
  ----我的体会Top

3 楼mycode(不写代码)回复于 2001-02-18 05:30:00 得分 0

已经有高手搞定的Top

4 楼mycode(不写代码)回复于 2001-06-03 18:55:00 得分 0

谢谢两位!Top

相关问题

  • 再次请问COM组件运行速度问题
  • 在COM组件里创建adodb对象是否使程序运行速度更慢???
  • 如何让COM+组件服务在指定时间运行
  • 如何停止运行中的指定的com+组件?
  • 如何定时运行某段程序,可以用com组件?
  • dll特别是com组件等不能单独运行如何调试
  • COM组件在IE客户端运行的安全警告问题
  • 我的COM组件怎么样才能在别的机器上运行啊!!
  • 在web中怎么让com组件可以在服务器端运行
  • !!!!求解---C++Bulider 组件运行出错!!!!

关键词

  • 组件
  • 服务器
  • hp
  • 普通
  • socket
  • start
  • tcbuf
  • writelogfile
  • irecv
  • sock

得分解答快速导航

  • 帖主:mycode
  • lhxx
  • javabeans

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo