Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 套接字请求不返回整个文件_C++_Sockets_Download - Fatal编程技术网

C++ 套接字请求不返回整个文件

C++ 套接字请求不返回整个文件,c++,sockets,download,C++,Sockets,Download,我必须通过套接字从Internet下载文件。我写了这段代码,得到了一个奇怪的结果。当我编译并运行它时,它只是创建sample.mp3(它是空的)。若我用调试器运行它,它会创建一个文件并填充一点(274 720字节)。我怎样才能修好它? 我将代码::块与mingw32编译器一起使用 #include <iostream> #include <winsock2.h> #include <string> #include <fstream> #defi

我必须通过套接字从Internet下载文件。我写了这段代码,得到了一个奇怪的结果。当我编译并运行它时,它只是创建sample.mp3(它是空的)。若我用调试器运行它,它会创建一个文件并填充一点(274 720字节)。我怎样才能修好它? 我将代码::块与mingw32编译器一起使用

#include <iostream>
#include <winsock2.h>
#include <string>
#include <fstream>

#define DEFAULT_BUFFLEN 1024

using namespace std;

int main()
{
    char* host;
    char* req;

    host = "cs9-5v4.vk.me";
    req = "/p18/f854bad2afcb34.mp3?extra=KOpJtWM9maWNBYyDfiQwKFo6p6cZ_EfQz4O_Jzz26anBd9bPXYlqageCjJQe5yNqfnaGAXKtP5jwQYWf1CaTef9dJomPrzya";

    string rdyStr;
    rdyStr += "GET ";
    rdyStr += req;
    rdyStr += " HTTP/1.1\nHost: ";
    rdyStr += host;
    rdyStr += "\n\n";

    WSADATA wsaData;
    WORD version;
    int error;

    version = MAKEWORD( 2, 0);

    error = WSAStartup( version, &wsaData );

    if (error != 0)
    {
        cout << "There is some error:" << error << endl;
        return -1;
    }

    if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 0)
    {
        WSACleanup();
        cout << "Incorrect winsock version" << endl;
        return -2;
    }

    SOCKET client;

    client = socket(AF_INET, SOCK_STREAM, 0);

    struct hostent *Host;

    Host = gethostbyname( host );

    if (Host == NULL)
    {
        cout << "There is no such host" << endl;
        return -3;
    }

    struct sockaddr_in sin;

    memset(&sin, 0, sizeof(sin));

    sin.sin_family = AF_INET;
    sin.sin_port = htons(80);
    sin.sin_addr.s_addr = ((struct in_addr *)(Host->h_addr))->s_addr;

    if (connect(client, (struct sockaddr *) &sin, sizeof(sin)) == SOCKET_ERROR)
    {
        cout << "Cant connect to the server" << endl;
        return -4;
    }

    char result[DEFAULT_BUFFLEN];
    int recvResult = 1;
    int recvBufflen = DEFAULT_BUFFLEN;

    int rs = send(client, rdyStr.c_str(), recvBufflen, 0);
    rs = shutdown(client, SD_SEND);

    ofstream fl;
    fl.open("sample.mp3", ios::out | ios::binary);
    getchar();
    do
    {
        recvResult = recv(client, result, recvBufflen, 0);
        fl.write(result, recvResult);

        if (recvResult < 0)
        {
            cout << "There is some errors with reciecing info" << endl;
            return -5;
        }
    }
    while (recvResult > 0);

    fl.close();
}
#包括
#包括
#包括
#包括
#定义默认值\u BUFFLEN 1024
使用名称空间std;
int main()
{
字符*主机;
字符*请求;
host=“cs9-5v4.vk.me”;
req=“/p18/f854bad2afcb34.mp3?额外=KOPJTWM9MAWNBYDFIQWKFO6P6CZ\U EfQz4O\U JZZ26ANBD9BPXYLQAGEGECJQE5YNQFNAGAXKTP5JWQYWF1CATEF9DJOMPRZYA”;
字符串rdyStr;
rdyStr+=“获取”;
rdyStr+=req;
rdyStr+=“HTTP/1.1\n主机:”;
rdyStr+=主机;
rdyStr+=“\n\n”;
WSADATA WSADATA;
文字版本;
整数误差;
版本=MAKEWORD(2,0);
错误=WSAStartup(版本和wsaData);
如果(错误!=0)
{
cout在测试read()结果是否为零或为负之前,不应调用write()。可以将循环编写为:

while ((recvCount = recv(client, result, recvBufLen, 0)) > 0)
{
    fl.write(result, recvResult);
}

然后进行错误测试。注意:如果结果为负,则应在某处打印WSAGetLastError()值。

谢谢您的建议,但它仍然不起作用。sample.mp3仍有269kb的信息,istead为7140kb。