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