读书人

InternetWriteFile 是不是也会阻塞 怎

发布时间: 2012-06-12 14:21:25 作者: rapoo

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

C/C++ code
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写入的数据,我也还没明白为什么,纠结啊。。。

读书人网 >VC/MFC

热点推荐