#ifdef _WIN32_WCE
#include "stdafx.h"
#endif
#ifndef _WIN32_WCE
#define WIN32_LEAN_AND_MEAN
#endif
#include
#include
#include
#include
#include
#include
#include
#ifdef _WIN32_WCE
#pragma comment(lib, "ws2.lib")
#else
#pragma comment(lib, "ws2_32.lib")
#endif
#define PP_NAME "User-Agent:rtsp
client(v1.0)"
#define PP_CRLF "/r/n"
//测试之用
//打开连接
long InitSocket();
//关闭连接
long DeInitSocket();
//初始化tcp socket
long InitTCPSocket(int port);
//初始化udp socket
long InitUDPSocket(const char *ip, int port);
//取socket端口号
long GetSokcetPort(int sock, int *port);
//读取数据
long ReadSocket(int sock, char *buf, int len, int timeout);
//发送命令数据
long SendRTSPCmd(int sock, const char *cmd, const char
*szparam);
//解析rtsp命令回应数据
long PraseRTSPCmd();
long PraseOptionCmd(const char *sz);
long PraseDescribeCmd(const char *sz);
long PraseSetupCmd(const char *sz, char *sess);
long PrasePlayCmd(const char *sz);
long GetResponseCode(const char
*sz); //取返回值
//
//字符串操作函数static char*
getLine(char* startOfLine);
//生成rtsp发送命令
char * GetRTSPCmd(const char *);
char * GetOptionCmd(char *url);
char * GetDescribeCmd(char *url);
char * GetPlayCmd(char *url, char *session, char *range);
char * GetSetupCmd(char *url, int port1, int port2);
char * GetReportCmd(char *);
//
//日志函数
long logwr(void *, int len);
//全局变量定义区
fd_set rfdsock;
//日志写入文件指针
FILE *fp = NULL;
//
//
//rtsp请求解析
long PraseURL(const char *url, char *szip, int *iport);
int _tmain(int argc, _TCHAR* argv[])
{
int sockin, sc1, sc2;
sockaddr_in addr;
char *buf, *szcmd, *url;
char szip[32];
int nlen, iret, iport;
int ip1, ip2;
long lret;
//初始化变量
FD_ZERO(&rfdsock);
fp = fopen("1.txt", "w+");
//分配缓冲区
nlen = 10240;
buf = (char*)malloc(nlen);
//定义要连接的url
//url =
"rtsp://192.168.1.43:2554/realmp3.mp3";
url = "rtsp://192.168.1.42/realmp3.mp3";
//url = "rtsp://192.168.1.43/1.amr";
//初始化sock
InitSocket();
//分析url请求,取出ip,端口
lret = PraseURL(url, szip, &iport);
//初始化与服务器连接的socket
sockin = InitTCPSocket(0);
//与服务器连接
addr.sin_family = AF_INET;
addr.sin_port = htons(iport);
addr.sin_addr.s_addr = inet_addr(szip);
iret = connect(sockin,(struct
sockaddr*)&addr, sizeof addr);
//发送option命令
szcmd = GetOptionCmd(url);
lret = SendRTSPCmd(sockin,
"OPTIONS",szcmd);
free(szcmd);
lret = ReadSocket(sockin, buf, nlen,100);
//发送DESCRIBE命令
szcmd = GetDescribeCmd(url);
lret = SendRTSPCmd(sockin, "DESCRIBE",
szcmd);
free(szcmd);
lret = ReadSocket(sockin, buf, nlen, 100);
//解析Response
lret = PraseDescribeCmd((const char*)buf);
//创建客户端接收端口
sc1 = InitUDPSocket(NULL, 6544);
sc2 = InitUDPSocket(NULL, 6545);
//将sock加入到要等待的队列
FD_SET(sc1, &rfdsock );
FD_SET(sc2, &rfdsock);
lret = GetSokcetPort(sc1, &ip1);
lret = GetSokcetPort(sc2, &ip2);