我用客户端使用wininet的建立http连接代码如下:
hOpen = InternetOpen (TEXT("MyHttpTest"), INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
hConnect = InternetConnect (hOpen, lpszServer, INTERNET_DEFAULT_HTTP_PORT, NULL, NULL,                        NTERNET_SERVICE_HTTP, 0, NULL);
hRequest = HttpOpenRequest (hConnect, TEXT("POST"), lpszUri, "HTTP/1.1", NULL,                                (LPCTSTR*)AcceptTypes, dwFlags,  0);
result = HttpSendRequest (hRequest, NULL, 0, szDataBuf, dwDataBufLength);给服务器发一个POST请求,并发送数据,数据放在缓存szDataBuf中,数据量大约几兆。在服务器端建立一个socket,并用WSARecv接收数据时发现,数据有丢失现象,而且每一次发送接收的数据都会不一样大,这是怎么回事,如果传几k的数据能够确实接收到,为什么传大量的数据出现问题呢??在客户端我使用了HttpSendRequestEx,InternetWriteFile和HttpEndRequest的方式也出现同样的问题?不知如何解决??

解决方案 »

  1.   

    http协议是基于tcp的,按道理不会丢数据.你查下你的代码 调试下:)
      

  2.   

    数据量大的话建议还是使用socket来完成吧.
      

  3.   


    接收端我使用了循环接收,如下:
    while(true)
    {
       result = recv(client, sztmpBuf, sizeof(sztmpBuf), 0);
       if ( (dwLength-= result)  == 0)
       {
    break;
       }
    }
    dwLength为接收数据的长度,通过这样的方式可以完整的接收了。如果事先未知文件的长度,该如何接收呢。另外,能否用WSARecv()接收大量数据呢?
      

  4.   

    while(true) 

       result = recv(client, sztmpBuf, sizeof(sztmpBuf), 0); 
       if ( (dwLength-= result)  == 0) 
       { 
    break; 
       } 

    这一段应该是这样吧
    while(true) 

       result = recv(client, sztmpBuf, dwLength, 0); 
       if ( (dwLength-= result)  == 0) 
       { 
    break; 
       } 

      

  5.   


    to cathysun118
    能否用WSARecv接收?