本帖最后由 VisualEleven 于 2012-04-23 09:18:14 编辑

解决方案 »

  1.   

    这个不一定,如果3G的数据又多一点的,一定要搞清楚是什么问题
    这个问题的本质我看是这样,recv返回的数字是不是一定就是表示接收到多少字节数据?会不会出现说实际已经没有数据了,但recv还会返回大于0的情况?或者实际读了1024字节数据,但返回值是1500
      

  2.   

    看看最后几k是什么内容
    是不是servlet自身的传输协议有标记文件结束的数据包被你误认为是文件的一部分了
      

  3.   

    这样是可以解决问题,但问题原因仍然是个迷
    我做过测试,服务器那边不设置Content-Length,也就是说,下载的时候不知道文件大小,我用IE、chrome都能正常下载,长度正常,为什么我就不行呢?很郁闷啊
      

  4.   

    servlet 输出本来就会有一些http头信息,直接下载一个文件则没有。
    你用浏览器下载,它会自动识别头,并且不会保存此头信息,所以正确,用recv只是把原始的信息读出来。正常现象,用recv接受http协议的文件时,去掉协议头即可
      

  5.   

    socket我也没做过做什么其它设定WORD wVersionRequested;
    WSADATA wsaData;
    int err;wVersionRequested = MAKEWORD(2, 2);
     
    err = WSAStartup(wVersionRequested, &wsaData);
    if (err != 0)
    {
    return 0;
    }
    SOCKET s = NULL;
    sockaddr_in sa;
    ::memset(&sa, 0, sizeof(sockaddr));
    s = ::socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (s == INVALID_SOCKET)
    {
    ::MessageBox(hWnd, "创建socket失败", "", MB_OK);
    }
    sa.sin_family = PF_INET;
    sa.sin_addr.S_un.S_addr = ::inet_addr("127.0.0.1");
    sa.sin_port = ::ntohs(80);
    err = connect(s, (sockaddr*)&sa, sizeof(sockaddr_in));
    if (err == SOCKET_ERROR)
    {
    errorCode = WSAGetLastError();
    ::MessageBox(hWnd, "socket连接失败", "", MB_OK);
    }// 发http报头
    ::send(s, buffer, length, 0);// 接收http报头,可以从Content-Length里得到长度,测试中这里是正常的
    ...// 出现空白行后就是文件数据了
    int r = 0;
    DWORD length = 0;
    while ((r = ::recv(s, buffer, 51200, 0)) > 0) {
    length += r;
    }
      

  6.   

    测试过,大于等于2G时候,http的Content-Length没有出问题,我的程序把数字字符串转换成DWORD也没问题
      

  7.   

    web 服务器返回的数据可能有其他格式: chunked 特别是大文件Transfer-Encoding: chunked这时每段数据会多包涵一些 数字, 这样接收的会多出一些数据