HttpSendRequest的阻塞问题?

CCliveHunter 2012-05-02 03:26:16
遇到这样一个问题,写了一个程序发送一个Http包到服务器,数据又服务器上的asp处理,开始程序是Win32 Applacation工程的,没有任何问题,后来由于需求将Win32 Applacation程序改成Win32 Dll 工程,由一个控台程序LoadLibrary来实现发送http包功能,就会出现HttpSendRequest阻塞不动了,此时机器连网页都打不开,谁遇到过侧类奇怪的问题能指点一下,如果哪位高手好心帮助调试一下,不胜感谢!!!
Win32 Dll 工程代码如下:

#include "stdafx.h"
#include "windows.h"
#include "stdio.h"
#include "iostream.h"
#include <wininet.h>

#pragma comment(lib, "Wininet.lib")



BOOL SendRequest(char *URL, char *CgiName, int iPort,
char *TransData, int TransDataLen,
char *RetBuffer, DWORD *pdwRetBufferSize,DWORD *pdwBytesRead)
{
printf("In SendRequest,URL:%s,CfiName:%s,Port:%d\r\n",URL,CgiName,iPort);
HINTERNET hSession=NULL;
HINTERNET hConnect=NULL;
HINTERNET hRequest=NULL;
BOOL bSendRequest=FALSE;
INT bSuccess=0;
DWORD dwErrorCode;
TransDataLen=0;
hSession=InternetOpen(0,INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,0);
if (hSession!=NULL)
{
DWORD dwTimeout=4000;
BOOL b_retSetOption=InternetSetOption(hSession,INTERNET_OPTION_CONNECT_TIMEOUT,&dwTimeout,sizeof(dwTimeout));
if (!b_retSetOption)
{
dwErrorCode=GetLastError();
cout<<"GetLastError_SetOption1: "<<dwErrorCode<<endl;
goto ERRORCODE;
}
}
else
{
dwErrorCode=GetLastError();
cout<<"GetLastError_InternetOpen: "<<dwErrorCode<<endl;
goto ERRORCODE;
}

printf("In InternetConnect\r\n");
//连接服务器
hConnect=InternetConnect(hSession,URL,iPort,NULL,NULL,INTERNET_SERVICE_HTTP,0,0);
if (!hConnect)
{
dwErrorCode=GetLastError();
cout<<"GetLastError_InternetConnect: "<<dwErrorCode<<endl;
goto ERRORCODE;
}


printf("In HttpOpenRequest\r\n");
//创建一个请求
hRequest=HttpOpenRequest(hConnect,"POST",CgiName,"HTTP/1.0",NULL,NULL,0,0);
if (!hRequest)
{
dwErrorCode=GetLastError();
cout<<"GetLastError_HttpOpenRequest: "<<dwErrorCode<<endl;
goto ERRORCODE;
}


printf("In HttpSendRequest\r\n");
//发送请求

bSendRequest=HttpSendRequest(hRequest,"Content-Type: application/x-www-form-urlencoded\r\n",-1,TransData,TransDataLen);
if (!bSendRequest)
{
dwErrorCode=GetLastError();
cout<<"GetLastError_HttpSendRequest: "<<dwErrorCode<<endl;
goto ERRORCODE;
}


printf("In InternetReadFile\r\n");
//获得返回结果

if (RetBuffer&&*pdwRetBufferSize>0)
{
DWORD dwReaded=0;
char *p=RetBuffer;
DWORD dwTotalBytesRead=0;
while (TRUE)
{
Sleep(100);
p=p+dwReaded;
dwTotalBytesRead=dwTotalBytesRead+dwReaded;
if (!InternetReadFile(hRequest,p,*pdwRetBufferSize,&dwReaded))
{
dwErrorCode=GetLastError();
cout<<"GetLastError_InternetReadFile: "<<dwErrorCode<<endl;
goto ERRORCODE;
}
if (dwReaded==0)
{
break;
}
*pdwRetBufferSize=*pdwRetBufferSize-dwReaded;
}
*pdwBytesRead=dwTotalBytesRead;//返回实际读到的总字节数
}
else
{
goto ERRORCODE;
}

printf("Out InternetReadFile\r\n");
//关闭
if (hRequest)
InternetCloseHandle(hRequest);
if (hConnect)
InternetCloseHandle(hConnect);
if (hSession)
InternetCloseHandle(hSession);

return TRUE;

ERRORCODE:

printf("Error\r\n");
if (hRequest)
InternetCloseHandle(hRequest);
if (hConnect)
InternetCloseHandle(hConnect);
if (hSession)
InternetCloseHandle(hSession);

return FALSE;
}




BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
char resu[1024]={0};
DWORD dwBytesRead=0;
char retBuf[1024]={0};
DWORD dwRetBufLen=1024;
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
{
SendRequest("xxx.xxx.xxx.xxx", "xxx.asp", 80,resu, strlen(resu)+1,retBuf, &dwRetBufLen,&dwBytesRead);
}
break;
}

return TRUE;
}

控台程序只实现一个LoadLibrary的工程加载以上Dll就行
...全文
297 1 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
Eleven 2012-05-02
  • 打赏
  • 举报
回复
DLL中导出一个接口函数,在接口函数中调用SendRequest()

18,363

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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