winhttp+SSL POST上传文件问题?(有源码)

tj_biz 2012-11-20 04:35:33
问题是上传小于50K的文件可以,大于50K的不行(这段程序去掉SSL,就可以上传大文件)

DWORD dwSize = 0;
DWORD dwDownloaded = 0;
LPSTR pszOutBuffer;
BOOL bResults = FALSE;
HINTERNET hSession = NULL,
hConnect = NULL,
hRequest = NULL;

// Use WinHttpOpen to obtain a session handle.
hSession = WinHttpOpen( L"WinHTTP Example/1.0",
WINHTTP_ACCESS_TYPE_DEFAULT_PROXY,
WINHTTP_NO_PROXY_NAME,
WINHTTP_NO_PROXY_BYPASS, 0 );

// Specify an HTTP server.
if( hSession )
hConnect = WinHttpConnect( hSession, L"127.0.0.1",
INTERNET_DEFAULT_PORT, 0 );

// Create an HTTP request handle.
if( hConnect )
{
hRequest = WinHttpOpenRequest( hConnect, L"POST",L"/rel.aspx", NULL,WINHTTP_NO_REFERER,
WINHTTP_DEFAULT_ACCEPT_TYPES,
WINHTTP_FLAG_SECURE );
}
else
{
int m_lastErrorCode;
m_lastErrorCode=GetLastError();
MessageBox(L"WinHttpConnect NG");
}

DWORD dwFlags;
DWORD dwBuffLen = sizeof(dwFlags);
WinHttpQueryOption (hRequest, WINHTTP_OPTION_SECURITY_FLAGS,(LPVOID)&dwFlags, &dwBuffLen);
dwFlags |= SECURITY_FLAG_IGNORE_UNKNOWN_CA;
dwFlags |= SECURITY_FLAG_IGNORE_CERT_DATE_INVALID;
dwFlags |= SECURITY_FLAG_IGNORE_CERT_CN_INVALID;
//dwFlags |= SECURITY_FLAG_IGNORE_CERT_WRONG_USAGE;
WinHttpSetOption (hRequest, WINHTTP_OPTION_SECURITY_FLAGS,&dwFlags, sizeof (dwFlags) );

// Send a request.

//打开文件
long filelen = 0;
FILE * fpf = fopen("c:\\46.jpg", "rb");
if (NULL == fpf)
{
}
fseek(fpf, 0, SEEK_END);
filelen = ftell(fpf);
char * buffer=NULL;
buffer=new char[filelen+1];
fseek(fpf, 0, SEEK_SET);
fread(buffer, 1, filelen, fpf);
fclose(fpf);

HCERTSTORE m_hMyStore;
PCCERT_CONTEXT pCertContext;

if(!(m_hMyStore = CertOpenStore(
CERT_STORE_PROV_SYSTEM,
0,
NULL,
CERT_SYSTEM_STORE_CURRENT_USER,
L"MY")))
{

}
else
{
// If we get to this stage, the certificate store
// was opened successfully.
// Display a selection of certificates to choose from.
pCertContext = CryptUIDlgSelectCertificateFromStore(
m_hMyStore,
NULL,
NULL,
NULL,
CRYPTUI_SELECT_EXPIRATION_COLUMN |
CRYPTUI_SELECT_LOCATION_COLUMN |
CRYPTUI_SELECT_FRIENDLYNAME_COLUMN |
CRYPTUI_SELECT_INTENDEDUSE_COLUMN ,
0,
NULL);
}
WinHttpSetOption( hRequest,WINHTTP_OPTION_CLIENT_CERT_CONTEXT,(LPVOID) pCertContext,sizeof(CERT_CONTEXT) );
CertFreeCertificateContext( pCertContext );
CertCloseStore( m_hMyStore, 0 );

WinHttpSetTimeouts( hRequest, 1000000, 1000000, 1000000, 1000000);

bResults = WinHttpSendRequest( hRequest,WINHTTP_NO_ADDITIONAL_HEADERS, 0,(LPVOID)buffer, filelen,filelen, 0 );
if(!bResults)
{
int m_lastErrorCode;
m_lastErrorCode=GetLastError();
}

bResults = WinHttpReceiveResponse( hRequest, NULL );
if( bResults )
{
MessageBox(L"WinHttpReceiveResponse OK");

}
else
{
int m_lastErrorCode;
m_lastErrorCode=GetLastError();
MessageBox(L"WinHttpReceiveResponse NG");
}


if( bResults )
{
do
{
// Check for available data.
dwSize = 0;
if( !WinHttpQueryDataAvailable( hRequest, &dwSize ) )
printf( "Error %u in WinHttpQueryDataAvailable.\n",
GetLastError( ) );

// Allocate space for the buffer.
pszOutBuffer = new char[dwSize+1];
if( !pszOutBuffer )
{
printf( "Out of memory\n" );
dwSize=0;
}
else
{
// Read the data.
ZeroMemory( pszOutBuffer, dwSize+1 );

if( !WinHttpReadData( hRequest, (LPVOID)pszOutBuffer,
dwSize, &dwDownloaded ) )
printf( "Error %u in WinHttpReadData.\n", GetLastError( ) );
else
printf( "%s", pszOutBuffer );
// Free the memory allocated to the buffer.
delete [] pszOutBuffer;
}
} while( dwSize > 0 );
}

// Report any errors.
if( !bResults )
printf( "Error %d has occurred.\n", GetLastError( ) );

// Close any open handles.
if( hRequest ) WinHttpCloseHandle( hRequest );
if( hConnect ) WinHttpCloseHandle( hConnect );
if( hSession ) WinHttpCloseHandle( hSession );
...全文
432 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
sdxzw 2014-11-26
  • 打赏
  • 举报
回复
是不是WinHttpSendRequest是不是转成异步了呢?看看MSDN的说明,他有可能转成一步操作了。
tj_biz 2012-11-26
  • 打赏
  • 举报
回复
就没有人关注吗!
tj_biz 2012-11-20
  • 打赏
  • 举报
回复
那为什么http没问题,https不行?
tj_biz 2012-11-20
  • 打赏
  • 举报
回复
引用 2 楼 oyljerry 的回复:
是不是数据截断了.
怎么解决呢?
oyljerry 2012-11-20
  • 打赏
  • 举报
回复
是不是数据截断了.
tj_biz 2012-11-20
  • 打赏
  • 举报
回复
调试时跟到这一行发现很怪的情况 bResults = WinHttpSendRequest( hRequest,WINHTTP_NO_ADDITIONAL_HEADERS, 0,(LPVOID)buffer, filelen,filelen, 0 ); 超过50K的大文件,WinHttpSendRequest很快执行完毕(正常应该是延迟几秒,等待上传完成),不知道除了什么问题,但是返回是TRUE。

18,356

社区成员

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

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