再次请问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);
实在是奇怪.