#ifdef _WIN32_WCE #include "stdafx.h" #endif #ifndef _WIN32_WCE #define WIN32_LEAN_AND_MEAN #endif #include <windows.h> #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("rtsp_log.txt", "w+"); //分配缓冲区; nlen = 10240; buf = (char*)malloc(nlen); //定义要连接的url; //url = "rtsp://192.168.1.43:2554/realmp3.mp3"; url = "rtsp://192.168.10.177/bipbop-gear1-all.ts"; //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); if(iret == SOCKET_ERROR) { int erro = WSAGetLastError(); printf("connect fail !"); Sleep(3000); closesocket(sockin); WSACleanup(); return 0; } //发送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); //