18,356
社区成员
发帖
与我相关
我的任务
分享
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.66:554/channel0";
//初始化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);
//发送Setup命令,告诉服务器客户端的接受数据的端口
szcmd = GetSetupCmd(url, ip1, ip2);
//告诉服务器客户端的端口
lret = SendRTSPCmd(sockin, "SETUP", szcmd);
free(szcmd);
lret = ReadSocket(sockin, buf, nlen, 100);
//解析Response返回的命令串
lret = PraseSetupCmd(buf, szip);
char *session, *srange;
session = szip;
//发送PLAY命令
srange = "Range: npt=0.000-39.471\r\n";
szcmd = GetPlayCmd(url, session, srange);
lret = SendRTSPCmd(sockin, "PLAY", szcmd);
free(szcmd);
lret = ReadSocket(sockin, buf, nlen, 100);
timeval tv;
fd_set fr;
int i;
tv.tv_sec = 20;
tv.tv_usec = 0;
struct sockaddr_in addr2;
int addrlen;
addrlen = sizeof addr;
//将数据写到文件中去
FILE *ffp;
ffp = fopen("receive.m4e", "wb");
//开始接受数据了
while(true)
{
fr = rfdsock;
/*此处在接收到一定时候后,超时 */
lret = select(0, &fr, NULL, NULL, &tv);
if(lret == SOCKET_ERROR)
{
break;
}
else if(lret >0)
{
//判断是哪个socket可以读取数据了
for(i = 0; i< 2;i ++)
{
if(FD_ISSET(rfdsock.fd_array[i], &fr)
&& FD_ISSET(rfdsock.fd_array[i], &rfdsock))
{
lret = recvfrom(rfdsock.fd_array[i], buf, nlen,0, (struct sockaddr*)&addr2, &addrlen );
if(lret > 0 && ffp)
{
fwrite(buf+12, 1, lret-12, ffp);
}
else if(lret == SOCKET_ERROR)
{
break;
}
}
}
}
else if(lret == 0)
break;
}
fclose(ffp);
//退出后的清理工作
closesocket(sockin);
closesocket(sc1);
closesocket(sc2);
fwrite("\r\nend", 1, 5, fp);
fclose(fp);