InternetWriteFile 是不是也会阻塞 如何设置超时?
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;}
[解决办法]
我也遇到了怪异的问题
在没有HTTP代理的情况下 InternetWriteFile就发送成功客户端那边也能正常接受数据,
但是打开HTTP代理(不需要用户名密码验证)的情况下,程序就阻塞在InternetWriteFile这了,
而且InternetWriteFile还返回TRUE,但是那边就是收不到,只有把服务端关闭了,这时客户端竟然收到刚才InternetWriteFile写入的数据,我也还没明白为什么,纠结啊。。。