InternetWriteFile 是不是也会阻塞 如何设置超时?

时间:2022-05-04 00:35:45
DWORD WINAPI DownLoad(LPVOID lparameter)
{
char buf[RECVLEN]={0};
char downloadbuf[SENDLEN]={0};
COMMAND downloadstr;
int ret=0;
char threadrecvbuf[RECVLEN]={0};
DWORD offset=((DWORD*)lparameter)[0];//offset
DWORD destpathlen=((DWORD*)lparameter)[1];
TCHAR destpatha[MAX_PATH]={0};
    memcpy(destpatha,(char*)lparameter+8,destpathlen*2);
    //
FILE*fp;
if ( (fp=_wfopen(destpatha,_T("rb")))==NULL )
{
loadstop=false;
memset((char *)&downloadstr,0,sizeof(COMMAND));
downloadstr.num=NUM;
downloadstr.order=LOADFILE;
memset(downloadbuf,0,SENDLEN);
base64Encode((char *)&downloadstr,downloadbuf,sizeof(COMMAND));
EnterCriticalSection(&g_cs);
ret=SendCgiRequest(downloadbuf,buf);
if (ret!=3)
{
ret=SendCgiRequest(downloadbuf,buf);
if (ret!=3)
{
LeaveCriticalSection(&g_cs);
return 1;
}
}
LeaveCriticalSection(&g_cs);
        return 0;
}
INTERNET_BUFFERS ib;
DWORD dwTotalSize=1000;//file size
DWORD dwBufSize=6000;//data size
fseek(fp,0,SEEK_END);
int filelen=ftell(fp);
dwTotalSize=filelen-offset;//file len+6000
rewind(fp);
memset(&ib, 0, sizeof(INTERNET_BUFFERS));
ib.dwStructSize = sizeof(INTERNET_BUFFERS);
ib.dwBufferTotal = dwTotalSize;
ib.dwBufferLength = dwBufSize; 

HINTERNET hInternet = ::InternetOpenA("Sample String", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
HINTERNET hConnection = ::InternetConnectA(hInternet, servname, port, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0);
HINTERNET hRequest = ::HttpOpenRequestA(hConnection, "POST", "test", NULL, NULL, NULL, 0, INTERNET_FLAG_EXISTING_CONNECT|INTERNET_FLAG_NO_AUTO_REDIRECT|INTERNET_FLAG_HYPERLINK);
HttpSendRequestEx(hRequest, &ib, 0, HSR_INITIATE, 0);
Sleep(2000);
char buffer[6000]={0};
DWORD dwRead;
DWORD err;
fseek(fp,offset,SEEK_SET);
int tempoffset=0;
while(1)
{
Sleep(sleeploadfile);
if (loadstop==false)
{
fclose(fp);
InternetCloseHandle(hRequest);
InternetCloseHandle(hConnection);
        InternetCloseHandle(hInternet);
return 0;
}
memset(buffer,0,6000);
        tempoffset=ftell(fp);
if ((filelen-tempoffset)==0)
{
break;
}
else
if ((filelen-tempoffset)<6000)
{
err=fread(buffer,1,filelen-tempoffset,fp);
}
else
err=fread(buffer,1,6000,fp);
if (InternetWriteFile(hRequest, buffer, err, &dwRead)==TRUE)
{
printf("InternetWriteFile ok\n");
printf("%d\n",dwRead);
}
else
{
printf("InternetWriteFile fail\n");
        fclose(fp);
if (hRequest)
{
InternetCloseHandle(hRequest);
}
if (hConnection)
{
InternetCloseHandle(hConnection);
}
if (hInternet)
{
InternetCloseHandle(hInternet);
}
return 0;
}

}
fclose(fp);
//  memset(buffer,0,6000);
//  strcpy(buffer,"endendendendend");
//  InternetWriteFile(hRequest, buffer, err, &dwRead);//TRUE :  CHENGGONG
//     if (InternetWriteFile(hRequest, buffer, err, &dwRead)==TRUE)
//     {
//  printf("InternetWriteFile ok\n");
//  printf("%d\n",dwRead);
//     }
printf("send over\n");
InternetCloseHandle(hRequest);
InternetCloseHandle(hConnection);
InternetCloseHandle(hInternet);
return 0;
}

3 个解决方案

#1


求大神 求救

#2


问题尚未解决 不能沉

#3


我也遇到了怪异的问题
在没有HTTP代理的情况下 InternetWriteFile就发送成功客户端那边也能正常接受数据,
但是打开HTTP代理(不需要用户名密码验证)的情况下,程序就阻塞在InternetWriteFile这了,
而且InternetWriteFile还返回TRUE,但是那边就是收不到,只有把服务端关闭了,这时客户端竟然收到刚才InternetWriteFile写入的数据,我也还没明白为什么,纠结啊。。。

#1


求大神 求救

#2


问题尚未解决 不能沉

#3


我也遇到了怪异的问题
在没有HTTP代理的情况下 InternetWriteFile就发送成功客户端那边也能正常接受数据,
但是打开HTTP代理(不需要用户名密码验证)的情况下,程序就阻塞在InternetWriteFile这了,
而且InternetWriteFile还返回TRUE,但是那边就是收不到,只有把服务端关闭了,这时客户端竟然收到刚才InternetWriteFile写入的数据,我也还没明白为什么,纠结啊。。。