为什么在接收rtsp网络视频流总是接收不到数据的!

记录在案 2011-08-30 05:23:45
为什么在接收rtsp网络视频流总是超时接收不到数据的!


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);

...全文
703 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Eleven 2011-09-01
  • 打赏
  • 举报
回复
感觉你的select模型写的有问题,你rfdsock集合根本就没有什么变化~
wyx100 2011-09-01
  • 打赏
  • 举报
回复
网络阻塞
记录在案 2011-08-31
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 worcy_kiddy 的回复:]
没发送过来吧?网络截包工具试试···
[/Quote]用VLC可以接收到的;
黑泡泡选手 2011-08-30
  • 打赏
  • 举报
回复
没发送过来吧?网络截包工具试试···
  • 打赏
  • 举报
回复
不会是网络阻塞了吧!!!!

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧