COM组件运行速度问题

mycode 2000-12-24 09:17:00
我做了一个普通程序和一个组件,用来查询域名信息用的.结果是普通程序只需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分?大家也顺便回答一下.
...全文
267 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
mycode 2001-06-03
  • 打赏
  • 举报
回复
谢谢两位!
mycode 2001-02-18
  • 打赏
  • 举报
回复
已经有高手搞定的
javabeans 2000-12-27
  • 打赏
  • 举报
回复
第一次确实很慢
但以后应该快多了
可以减少到原来的一半左右
----我的体会
随风bj 2000-12-25
  • 打赏
  • 举报
回复
不太清楚,不过COM组件一般比同样功能的应用程序慢,因为要进行一些合法性检查...

3,248

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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