64,701
社区成员
发帖
与我相关
我的任务
分享
#include <string>
#include <iostream>
#include <stdio.h>
#include <winsock.h>
#include <conio.h>
using namespace std;
#pragma comment("ws2_32.lib")
string serveraddr;
string host2ip(const string& strdomain);
void save2file(char *buffer,const string& filename);
int getlength(const string& sheader);
int port = 80;
int error=0;
int i = 0;
const int BUFFER_SIZE = 1024;
char buffer[BUFFER_SIZE] = {0};
char msg[BUFFER_SIZE];
const string file = "/BT/200802/1/118909.torrent";
const string url = "www.supbt.com";
const string filename = "1234.torrent";
FILE *f;
void sethttphead(const string& file,const string& server);
int main()
{
int r;
WSADATA wsa;
SOCKET sock;
struct sockaddr_in sin;
f = fopen(filename.c_str(),"a");
sethttphead(file,url);
if(WSAStartup(MAKEWORD(2,2),&wsa))
{
printf("WSAStartup Error: %d\n",WSAGetLastError());
getche();
return -1;
}
if((sock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==INVALID_SOCKET)
{
printf("Socket Error: %d\n",WSAGetLastError());
getche();
return -1;
}
sin.sin_family=AF_INET;
sin.sin_port=htons(port);
serveraddr = host2ip(url);
cout << serveraddr << endl;
sin.sin_addr.s_addr=inet_addr(serveraddr.c_str());
if(connect(sock,(struct sockaddr *)&sin,sizeof(sin))==SOCKET_ERROR)
{
printf("Connect Error: %d\n",WSAGetLastError());
printf("请检测网络连接!\n");
getche();
return -1;
}
if((r=send(sock,msg,sizeof(msg),0))==SOCKET_ERROR)
{
printf("Send Error: %d\n",WSAGetLastError());
getche();
return -1;
}
memset(buffer,0,BUFFER_SIZE);
if((r=recv(sock,buffer,BUFFER_SIZE,0))==SOCKET_ERROR)
{
printf("Recv Error: %d\n",WSAGetLastError());
closesocket(sock);
//getche();
return -1;
}
string header = string(buffer);
int ilength = getlength(header);
int leftlength = ilength;
cout << ilength << endl;
//getfilelength
char *p = strstr(buffer, "\r\n\r\n");
p += 4;
fwrite(p,strlen(p),1,f);
leftlength -= strlen(p);
int i=0;
int count = strlen(p);
while(true)
{
//if(leftlength > 0)
memset(buffer, 0, BUFFER_SIZE);
r = recv(sock, buffer, BUFFER_SIZE, 0);
if (r < 0) {
closesocket(sock);
return 2;
}
if (r == 0) {
break;
}
int tmp;
tmp = leftlength;
leftlength -= r;
if(leftlength > 0){
fwrite(buffer,r,1,f);
count += r;
}
else if(leftlength == 0){
//
}
else{
cout << buffer << endl;
string s = string(buffer);
cout << "haha" << endl;
cout << s.substr(0,tmp+3) << endl;
count += tmp;
fwrite(buffer,tmp+3,1,f);
}
//cout << buffer << endl;
cout << i++ << " r is "<< r << endl;
}
cout << count << endl;
fclose(f);
closesocket(sock);
WSACleanup();
getche();
return 0;
}
void sethttphead(const string& file,const string& server)
{
strcat(msg,"GET ");
strcat(msg,file.c_str());
strcat(msg," HTTP/1.1");
strcat(msg,"\r\n");
strcat(msg,"Accept:*/*");
strcat(msg,"\r\n");
strcat(msg,"Accept-Encoding: gzip, deflate");
strcat(msg,"\r\n");
strcat(msg,"User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)");
strcat(msg,"\r\n");
strcat(msg,"Host:");
strcat(msg,server.c_str());
strcat(msg,"\r\n");
strcat(msg,"Connection: Keep-Alive");
strcat(msg,"\r\n");
strcat(msg,"\r\n");
}
//---------------------------------------------------------------------------
string host2ip(const string& strdomain)
{
SOCKADDR_IN saddr;
WORD wVersionRequested;
WSADATA wsaData;
hostent *pHostIp;
int nErrorNum;
wVersionRequested = MAKEWORD(2, 2);
nErrorNum = WSAStartup(wVersionRequested, &wsaData);
if(nErrorNum != 0)
{
return "";
}
saddr.sin_family = AF_INET;
pHostIp = gethostbyname(strdomain.c_str());
if(pHostIp == NULL)
{
return "0.0.0.0";
}
WSACleanup();
return (string)inet_ntoa(*(LPIN_ADDR)*(pHostIp->h_addr_list));
}
void save2file(char *buffer,const string& filename)
{
FILE *f;
f = fopen(filename.c_str(),"a+");
fwrite(buffer,strlen(buffer),1,f);
fclose(f);
}
int getlength(const string& sheader){
//
/*
int istart = header.find("Content-length:")
int iend =
*/
char * cont_len_pos;
unsigned long cont_length;
const char* header = sheader.c_str();
cont_len_pos =(char *)strstr(header,"Content-Length:");
cont_len_pos = (char *)strchr(cont_len_pos,' ');
cont_len_pos++;
sscanf(cont_len_pos, "%ld", &cont_length);
return cont_length;
}
fwrite(p,strlen(p),1,f);
f = fopen(filename.c_str(),"ab");
memset(buffer,0,BUFFER_SIZE);
if((r=recv(sock,buffer,BUFFER_SIZE,0))==SOCKET_ERROR)
{
printf("Recv Error: %d\n",WSAGetLastError());
closesocket(sock);
//getche();
return -1;
}
string header = string(buffer);
int ilength = getlength(header);
int leftlength = ilength;
cout << ilength << endl;
//getfilelength
char *p = strstr(buffer, "\r\n\r\n");
p += 4;
fwrite(p,strlen(p),1,f);
leftlength -= strlen(p);
int i=0;
int count = strlen(p);
else{
cout << buffer << endl;
string s = string(buffer);
cout << "haha" << endl;
cout << s.substr(0,tmp+3) << endl;
count += tmp;
fwrite(buffer,tmp+3,1,f);
}
else{
cout << buffer << endl;
string s = string(buffer);
cout << "haha" << endl;
cout << s.substr(0,tmp) << endl;
count += tmp;
fwrite(buffer,tmp,1,f);
}