下面就只可以直接下载网页中任何的数据流文件,比如正在播放的mms数据流,或者asf,wma文件
#include <iostream>
#include <fstream>
#include "winsock2.h"
using namespace std;
#define send_rq(msg) { send(sock,msg,strlen(msg),0);printf(msg);}
int request(char* hostname, char* api, char* parameters, string& message);
int main()
{
wsadata wsadata;
wsastartup (0x0101, &wsadata);
char hostname[200];
if(gethostname(hostname,sizeof(hostname))!=socket_error)
{
cout<<"hostname:"<<hostname<<endl;
string message;
request(hostname,"1.asf","111",message);
}
else
{
cout<<"gethostname,error\n";
}
wsacleanup( );
return 0;
}
int request(char* hostname, char* api, char* parameters, string& message)
{
sockaddr_in sin;
int sock = socket (af_inet, sock_stream, ipproto_tcp);
if (sock == -1)
{
return -100;
}
sin.sin_family = af_inet;
sin.sin_port = htons( (unsigned short)80);
struct hostent * host_addr = gethostbyname(hostname);
if(host_addr==null)
{
cout<<"unable to locate host"<<endl ;
return -103;
}
sin.sin_addr.s_addr = *((int*)*host_addr->h_addr_list) ;
cout<<"port :"<<sin.sin_port<<", address : "<< sin.sin_addr.s_addr<<endl;
//连接
if( connect (sock,(const struct sockaddr *)&sin, sizeof(sockaddr_in) ) == -1 )
{
cout<<"connect failed"<<endl ;
return -101;
}
//发送接收文件命令
send_rq("get /");
send_rq(api);//char* api;这里填url文件名,比如http://127.0.0.1:8888/1.asf中的1.asf
send_rq(" http/1.0");
send_rq("\r\n");
send_rq("host: ");
send_rq(hostname);
send_rq("\r\n");
send_rq("connection: close");
send_rq("\r\n");
send_rq("accept: */*\r\n");
send_rq("user-agent: nsplayer/4.1.0.3856\r\n");
//char content_header[100];
//sprintf(content_header,"content-length: %d\r\n",strlen(parameters));
//send_rq(content_header);
send_rq("pragma: no-cache,rate=1.000000,request-context=1\r\n");
send_rq("pragma: xplaystrm=1\r\n");
send_rq("pragma: xclientguid={c77e7400-738a-11d2-9add-0020af0a3278}\r\n");
send_rq("pragma: stream-switch-count=2\r\n");
send_rq("pragma: stream-switch-entry=ffff:1:0 ffff:2:0\r\n");
send_rq("\r\n");
//if you need to send a basic authorization
//string auth = "username:password";
//figureout a way to encode test into base64 !
//string authinfo = base64_encode(reinterpret_cast<const unsigned char*>(auth.c_str()),auth.length());
//string spassreq = "authorization: basic " + authinfo;
//send_rq(spassreq.c_str());
/*send_rq("\r\n");
send_rq(parameters);
send_rq("\r\n");*/
//接收头部
cout<<"####header####"<<endl;
char c1[1];
int l,line_length=0;
bool loop = true;
bool bheader = false;
bool find=false;
while(loop)
{
l = recv(sock, c1, 1, 0);
if(l<0)
loop = false;
if(c1[0]==’\n’)
{
if(line_length == 0) loop = false;
line_length = 0;
if(!find && message.find("200") != -1)
bheader = true;
message.clear();
find=true;
}
else if(c1[0]!=’\r’) line_length++;
cout<<c1[0];
message += c1[0];
}
//接收body
message="";
ofstream outfile("pplive.asf",ios::binary);
if(bheader)
{
cout<<"####body####"<<endl ;
char p[1024];
while((l = recv(sock,p,1023,0)) > 0)
{
outfile.write(p,l);
outfile.flush();
p[l] = ’\0’;
//message += p;
printf("%d\n",l);
}
//cout << (const char *)message;
outfile.flush();
}
else
{
outfile.close();
return -102;
}
}