再次请问COM组件运行速度问题

mycode 2000-12-26 07:40: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);
实在是奇怪.
...全文
136 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
mycode 2001-06-03
  • 打赏
  • 举报
回复
此问题也解决.
mycode 2000-12-28
  • 打赏
  • 举报
回复
可是我只发送了一次,并且等待函数是recv(),不知该如何跟踪进函数里去.
taolei 2000-12-28
  • 打赏
  • 举报
回复
刚好我昨天也遇到这个问题。问题可能出在send上,解决方法是把所有要发送的数据先放到一个buffer里,然后一次发送。
我想可能是当连续两次调用send,发送数非常小的数据,winsock驱动程序可能会认为还可能有第3次、第4次的send,所以它就做了个延时等待。
Jans 2000-12-27
  • 打赏
  • 举报
回复
我也遇到此问题!

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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