用udp实现HTTP Streaming协议从指定的url拉流
2006-05-10 09:01
302 查看
实现一个整型函数
int request (char* hostname, char* api, char* parameters, string& message)
主要分为建立udp,发送信令,接收服务器返回信令,接收数据三个部分功能
首先建立UDP:
#ifdef WIN_OS
{
WSADATA WsaData;
WSAStartup (0x0101, &WsaData);
}
#endif
sockaddr_in sin;
int sock = socket (AF_INET, SOCK_STREAM, 0);
if (sock == -1)
{
return -100;
}
sin.sin_family = AF_INET;
sin.sin_port = htons( (unsigned short)8080);
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;
}
其次定义一个宏:
#define SEND_RQ(MSG) send(sock,MSG,strlen(MSG),0);
向服务器发送信令:
SEND_RQ("GET ");
char* api;//这里填URL文件名,比如http://127.0.0.1:8888/1.asf中的1.asf
SEND_RQ(api);
SEND_RQ("HTTP/1.0/r/n");
SEND_RQ("Accept: */*/r/n");
SEND_RQ("User-Agent: NSPlayer/4.1.0.3925/r/n");
char content_header[100];
sprintf(content_header,"Content-Length: %d/r/n",strlen(parameters));
SEND_RQ(content_header);
SEND_RQ("Host: ");
SEND_RQ("hostname");
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("/r/n");
SEND_RQ(parameters);
SEND_RQ("/r/n");
接受服务器发送反馈信令:
//接收头部
cout<<"####HEADER####"<<endl;
char c1[1];
int l,line_length;
bool loop = true;
bool bHeader = false;
while(loop)
{
l = recv(sock, c1, 1023, 0);
if(l<0)
loop = false;
if(c1[0]=='/n')
{
if(line_length == 0) loop = false;
line_length = 0;
if(message.find("200") != string::npos)
bHeader = true;
}
else if(c1[0]!='/r') line_length++;
cout<<c1[0];
message += c1[0];
}
//接收body
message="";
if(bHeader)
{
cout<<"####BODY####"<<endl ;
char p[1024];
while((l = recv(sock,p,1023,0)) > 0)
{
cout.write(p,l) ;
p[l] = '/0';
message += p;
}
cout << message.c_str();
}
else
{
return -102;
}
//清理工作
#ifdef WIN_OS
WSACleanup( );
#endif
//-------------------------------------------------------------------------------------------------------------------------------------------------
相关的协议信令:
RTSP协议
//RTSP
DESCRIBE rtsp://wm.microsoft.com/ms/video/0001-hi.wmv RTSP/1.0
User-Agent: WMPlayer/9.0.0.2980 guid/3300AD50-2C39-46C0-AE0A-81D88F547805
Accept: application/sdp
Accept-Charset: UTF-8, *;q=0.1
X-Accept-Authentication: NTLM, Digest, Basic
Accept-Language: en-GB, *;q=0.1
CSeq: 1
Supported: com.microsoft.wm.srvppair, com.microsoft.wm.sswitch, com.microsoft.wm.eosmsg, com.microsoft.wm.predstrm
HTTP STREAM协议
//HTTP STREAM
GET /ms/contoso_100_files/0MM0.wmv HTTP/1.0
Accept: */*
User-Agent: NSPlayer/4.1.0.3925
Host: netshow.micro.com
Pragma: no-cache,rate=1.000000,stream-time=0,stream-offset=0:0,request-context=1,max-duration=0
Pragma: xClientGUID={2200AD50-2C39-46c0-AE0A-2CA76D8C766D}
//HTTP STREAM SECOND
GET /ms/contoso_100_files/0MM0.wmv HTTP/1.0
Accept: */*
User-Agent: NSPlayer/4.1.0.3925
Host: netshow.micro.com
Pragma: no-cache,rate=1.000000,stream-time=0,stream-offset=4294967295:4294967295,request-context=2,max-duration=2147609515
Pragma: xPlayStrm=1
Pragma: xClientGUID={2200AD50-2C39-46c0-AE0A-2CA76D8C766D}
Pragma: stream-switch-count=2
Pragma: stream-switch-entry=ffff:1:0 ffff:2:0
int request (char* hostname, char* api, char* parameters, string& message)
主要分为建立udp,发送信令,接收服务器返回信令,接收数据三个部分功能
首先建立UDP:
#ifdef WIN_OS
{
WSADATA WsaData;
WSAStartup (0x0101, &WsaData);
}
#endif
sockaddr_in sin;
int sock = socket (AF_INET, SOCK_STREAM, 0);
if (sock == -1)
{
return -100;
}
sin.sin_family = AF_INET;
sin.sin_port = htons( (unsigned short)8080);
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;
}
其次定义一个宏:
#define SEND_RQ(MSG) send(sock,MSG,strlen(MSG),0);
向服务器发送信令:
SEND_RQ("GET ");
char* api;//这里填URL文件名,比如http://127.0.0.1:8888/1.asf中的1.asf
SEND_RQ(api);
SEND_RQ("HTTP/1.0/r/n");
SEND_RQ("Accept: */*/r/n");
SEND_RQ("User-Agent: NSPlayer/4.1.0.3925/r/n");
char content_header[100];
sprintf(content_header,"Content-Length: %d/r/n",strlen(parameters));
SEND_RQ(content_header);
SEND_RQ("Host: ");
SEND_RQ("hostname");
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("/r/n");
SEND_RQ(parameters);
SEND_RQ("/r/n");
接受服务器发送反馈信令:
//接收头部
cout<<"####HEADER####"<<endl;
char c1[1];
int l,line_length;
bool loop = true;
bool bHeader = false;
while(loop)
{
l = recv(sock, c1, 1023, 0);
if(l<0)
loop = false;
if(c1[0]=='/n')
{
if(line_length == 0) loop = false;
line_length = 0;
if(message.find("200") != string::npos)
bHeader = true;
}
else if(c1[0]!='/r') line_length++;
cout<<c1[0];
message += c1[0];
}
//接收body
message="";
if(bHeader)
{
cout<<"####BODY####"<<endl ;
char p[1024];
while((l = recv(sock,p,1023,0)) > 0)
{
cout.write(p,l) ;
p[l] = '/0';
message += p;
}
cout << message.c_str();
}
else
{
return -102;
}
//清理工作
#ifdef WIN_OS
WSACleanup( );
#endif
//-------------------------------------------------------------------------------------------------------------------------------------------------
相关的协议信令:
RTSP协议
//RTSP
DESCRIBE rtsp://wm.microsoft.com/ms/video/0001-hi.wmv RTSP/1.0
User-Agent: WMPlayer/9.0.0.2980 guid/3300AD50-2C39-46C0-AE0A-81D88F547805
Accept: application/sdp
Accept-Charset: UTF-8, *;q=0.1
X-Accept-Authentication: NTLM, Digest, Basic
Accept-Language: en-GB, *;q=0.1
CSeq: 1
Supported: com.microsoft.wm.srvppair, com.microsoft.wm.sswitch, com.microsoft.wm.eosmsg, com.microsoft.wm.predstrm
HTTP STREAM协议
//HTTP STREAM
GET /ms/contoso_100_files/0MM0.wmv HTTP/1.0
Accept: */*
User-Agent: NSPlayer/4.1.0.3925
Host: netshow.micro.com
Pragma: no-cache,rate=1.000000,stream-time=0,stream-offset=0:0,request-context=1,max-duration=0
Pragma: xClientGUID={2200AD50-2C39-46c0-AE0A-2CA76D8C766D}
//HTTP STREAM SECOND
GET /ms/contoso_100_files/0MM0.wmv HTTP/1.0
Accept: */*
User-Agent: NSPlayer/4.1.0.3925
Host: netshow.micro.com
Pragma: no-cache,rate=1.000000,stream-time=0,stream-offset=4294967295:4294967295,request-context=2,max-duration=2147609515
Pragma: xPlayStrm=1
Pragma: xClientGUID={2200AD50-2C39-46c0-AE0A-2CA76D8C766D}
Pragma: stream-switch-count=2
Pragma: stream-switch-entry=ffff:1:0 ffff:2:0
相关文章推荐
- 用UDP实现HTTP Streaming协议从指定的URL拉流
- java实现:http协议get和post方法的url参数请求响应及交互
- HTTP协议请求实现类CloseableHttpClient和HttpsURLConnection及HttpURLConnection
- Node.js与网络:Node.js对TCP、UDP、Socket、HTTP等协议的实现和支持
- Node.js与网络:Node.js对TCP、UDP、Socket、HTTP等协议的实现和支持
- 一个使用HttpWebRequest类下载指定URL网页的例子
- Http Live Streaming 实现iphone在线播放视频
- Python实现udp协议的简单服务器和客户端通信
- Python实现基于TCP UDP协议的IPv4 IPv6模式客户端和服务端功能示例
- 需求(Java语言实现):对存有图片URL的txt文件进行逐行读取,自行下载txt文件中的图片到指定文件夹中
- 通信协议——Http、TCP、UDP
- Socket网络编程(二)UDP协议实现聊天工具
- HttpURLConnection-Post方法实现
- (TCP-over-UDP library):基于UDP协议之上实现通用、可靠、高效的TCP协议
- java实现http协议连接和下载
- http协议实现上传
- HTTP Live Streaming直播(iOS直播)技术分析与实现
- 简单的UDP协议实现
- 通过socket和Udp协议简单实现一个群体聊天工具(控制台)
- JAVA使用HttpUrlConnection实现自动上传文