2014-02-17 33 views
0

我必須通過套接字從Internet下載文件。我寫了這段代碼,結果有點奇怪。當我編譯它並運行它只是創建sample.mp3(它是空的)。如果我使用調試器運行它,它會創建文件並填充一點(274 720字節)。我該如何解決它? 我正在使用Code :: Blocks與mingw32 compilator。套接字請求不會返回整個文件

#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(); 
} 

回答

0

你不應該調用write(),直到後你測試的讀取()結果爲零或負數。你可以寫回路爲:

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

然後把錯誤測試後。注意如果您得到否定結果,您應該在某處打印WSAGetLastError()值。

+0

謝謝你的建議,但它仍然不想工作。 sample.mp3還有269kb的信息,而不是7140kb。 – Megaxela