linux网络编程之RTP协议

以下内容取自:

本机通信:
https://www.cnblogs.com/lidabo/p/4160138.html(RTP协议传输)
https://www.cnblogs.com/lidabo/p/4160145.html(RTP协议传输)

非本机:http://velep.com/archives/934.html(关于服务器ip的传输方法)

下载ffmpeg出错了于是从csdn上下载了一些ts格式的视频。测试环境是ubuntu16.04,VLC安装在ubuntu上,但如果用windows的VLC是无法通过访问ubuntu机子的静态ip获取到视频的,因为没有绑定特定的服务器ip。

其中的python文件用于获取到rtp协议的字段的值,VLC上的流设置:

根据获取到的值来为c编程中模拟rtp协议头:

80解析为1000 0000,也就是V:10(也就是值为2),P:0,X:0,CC:0。

扫描二维码关注公众号,回复: 4728074 查看本文章

第四列为递增的,也就是sequence_number。

其中的rtp_header格式考虑到本机字节序与网络字节序问题每个字节里的位反过来声明。注意unsigned short为16,unsigned int为32。

由于sequence需要满足递增的规律并且考虑到字节序的问题,因此需要htons()和ntohs()。

要使用域名访问的话将其改为:

添加一个头文件<arpa/inet.h>,再定义一个udp_ip为服务器的ip地址,再将dest_addr.sin_sddr.s_addr=INADDR_ANY改为dest_addr.sin_addr.s_addr=inet_addr(UDP_SERVER_IP)即可。

但是我这里的windows上的vlc访问192.168.157.10:6666(我的虚拟机的ip)会卡死,可能是流的问题?ping是能ping通的,不太清楚原因,以后再看。

这里看一下sendto和recvfrom函数:

客户端需要声明要发送信息给到的服务器端的ip,服务器端则定义INADDR_ANY就好。客户端和服务器端需要声明同样的端口才好进行通信。

//buf初始化:
bzero(buf,sizeof(buf));

//消息传送的主要操作:
len=recvfrom((int)sockfd,(void *)buf,sizeof(buffer),(unsigned int)flags,(struct sockaddr*)from,int *fromlen);//这里的buf也就是传回来的内容,可以直接print。注意最后一个参数要取址。

sendto((int)sockfd,(const void*)buffer,sizeof(buffer),(unsigned int)flags,(const struct sockaddr*)to,int tolen);//这个函数用到const应该是避免传输过程中修改发送端的数据。

//由用户发送消息的一端需要有读取字符设备的操作:
len=read(STDIN_FILENO,buf,sizeof(buf));

//sockaddr和sockaddr_in的关系:
其实是一样的可以互相转化,所占内存也是一样大的,赋值的时候我们用到sockaddr_in,函数调用就用sockaddr。

猜你喜欢

转载自blog.csdn.net/Parallel2333/article/details/85375420