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();
}
謝謝你的建議,但它仍然不想工作。 sample.mp3還有269kb的信息,而不是7140kb。 – Megaxela