社区
通信技术
帖子详情
关于组播和RTP的问题!!
8slob
2002-06-20 06:15:51
加精
组播采用D类地址,以1110开始 224.0.0.0---239.255.255.255,如果我在编基于组播的系统时,难道我需要申请基于224.0.0.0---239.255.255.255之间的组播地址吗??
第二个问题:RTP使用什么传输的?组播还是广播??
...全文
876
12
打赏
收藏
关于组播和RTP的问题!!
组播采用D类地址,以1110开始 224.0.0.0---239.255.255.255,如果我在编基于组播的系统时,难道我需要申请基于224.0.0.0---239.255.255.255之间的组播地址吗?? 第二个问题:RTP使用什么传输的?组播还是广播??
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
12 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
8slob
2002-06-28
打赏
举报
回复
加分了!
xuying
2002-06-25
打赏
举报
回复
Time To Live: 用来控制报文在网络上的生存时间,超过后,路由器就会丢弃报文,不再转发。
8slob
2002-06-25
打赏
举报
回复
顺便问一下,TTL参数干什么用的?
lxinjun
2002-06-24
打赏
举报
回复
真的不错!
学习
xuying
2002-06-22
打赏
举报
回复
下面的程序接收224.8.8.1:8888上的组播数据。
#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>
#define BUFFSIZE 2048
#define RECV_IP_ADDR "224.8.8.1"
#define DEST_PORT 8888
int main(int argc,char *argv[])
{
int sockfd;
int sock_reuse = 1;
struct ip_mreq multicast;
struct sockaddr_in recver_addr;
char szError[100];
int index = 0, // Integer index
iRecvLen; // Length of recv_sin
char szMessageA[1024*320]; // ASCII string
TCHAR szMessageW[1024*320]; // Unicode string
WSADATA WSAData;
WORD wVersionRequested;
wVersionRequested = MAKEWORD(2, 2);
if (WSAStartup (wVersionRequested , &WSAData) != 0)
{
printf ("recver:Initialize Winsock error!");
exit(1);
}
if (LOBYTE(WSAData.wVersion) != 2 || HIBYTE(WSAData.wVersion) != 2 ) {
WSACleanup( );
printf ("setsockopt failed! Error: %d", WSAGetLastError ());
exit(1);
}
multicast.imr_multiaddr.s_addr = inet_addr(RECV_IP_ADDR);
multicast.imr_interface.s_addr = htonl(INADDR_ANY);
recver_addr.sin_family = AF_INET;
recver_addr.sin_port = htons(DEST_PORT);
recver_addr.sin_addr.s_addr = INADDR_ANY;
if ((sockfd=socket(AF_INET,SOCK_DGRAM,0)) < 0) {
printf("recver:new a socket error!\n");
exit(1);
}
if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (char *)&sock_reuse, sizeof(sock_reuse)) < 0) {
printf("recver : socket options set error");
exit(1);
}
if (bind(sockfd,(struct sockaddr *)&recver_addr,sizeof(recver_addr)) < 0) {
closesocket(sockfd);
printf("recver:bind socket error!\n");
exit(1);
}
if (setsockopt(sockfd,IPPROTO_IP,IP_ADD_MEMBERSHIP,(char *)&multicast,sizeof(multicast)) < 0 ) {
sprintf (szError, TEXT("setsockopt failed! Error: %d"), WSAGetLastError ());
printf("%s\n", szError);
closesocket(sockfd);
exit(1);
}
printf("Receive on %s:%d\n", RECV_IP_ADDR, DEST_PORT);
iRecvLen = sizeof (recver_addr);
memset(szMessageA, 0, sizeof(szMessageA));
// Receive data from the multicasting group server.
if (recvfrom (sockfd,
szMessageA,
sizeof(szMessageA),
0,
(struct sockaddr FAR *) &recver_addr,
&iRecvLen) == SOCKET_ERROR)
{
wsprintf (szError, TEXT("recvfrom failed! Error: %d"),
WSAGetLastError ());
MessageBox (NULL, szError, TEXT("Error"), MB_OK);
closesocket (sockfd);
return FALSE;
}
else
{
// Convert the ASCII string to a Unicode string.
for (index = 0; index <= sizeof (szMessageA); index++)
szMessageW[index] = szMessageA[index];
MessageBox (NULL, szMessageW, TEXT("Info"), MB_OK);
}
// Disable receiving on Sock before closing it.
shutdown (sockfd, 0x00);
// Close Sock.
closesocket (sockfd);
WSACleanup ();
return 0;
}
xuying
2002-06-22
打赏
举报
回复
给你看段组播的程序吧,看了就明白了。组播与它本身的ip没有多大关系。
下面的程序向224.8.8.1:8888端口发送数据。
#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>
#define BUFFSIZE 2048
#define IP_ADDR "224.8.8.1"
#define DEST_PORT 8888
int main(int argc,char *argv[])
{
int sockfd;
struct sockaddr_in addr;
char szError[100];
char buf[] = "Hello, World!";
int ttl = 255 ; // Arbitrary TTL value.
WSADATA WSAData;
WORD wVersionRequested;
wVersionRequested = MAKEWORD(2, 2);
if (WSAStartup (wVersionRequested , &WSAData) != 0)
{
printf ("recver:Initialize Winsock error!");
exit(1);
}
if (LOBYTE(WSAData.wVersion) != 2 || HIBYTE(WSAData.wVersion) != 2 ) {
WSACleanup( );
printf ("setsockopt failed! Error: %d", WSAGetLastError ());
exit(1);
}
addr.sin_family = AF_INET;
addr.sin_port = htons(DEST_PORT);
addr.sin_addr.s_addr = inet_addr(IP_ADDR);
if ((sockfd=socket(AF_INET,SOCK_DGRAM,0)) < 0) {
printf("sender:new a socket error!\n");
exit(1);
}
if(setsockopt(sockfd, IPPROTO_IP, IP_MULTICAST_TTL, (char *)&ttl, sizeof(ttl))!=0)
{
printf("error setsockopt IP_MULTICAST_TTL\n");
exit(1);
}
/*
if (bind(sockfd,(struct sockaddr *)&recver_addr,sizeof(recver_addr)) < 0) {
closesocket(sockfd);
printf("recver:bind socket error!\n");
exit(1);
}
*/
if (sendto (sockfd, buf, sizeof(buf) , 0, (struct sockaddr *)&addr, sizeof(addr))
== SOCKET_ERROR)
{
wsprintf (szError, TEXT("sendto failed! Error: %d"),
WSAGetLastError ());
MessageBox (NULL, szError, TEXT("Error"), MB_OK);
closesocket (sockfd);
return FALSE;
}
else
{
printf("send ok\n");
}
// Close Sock.
closesocket (sockfd);
WSACleanup ();
return 0;
}
8slob
2002-06-22
打赏
举报
回复
我想知道客户段到底怎么找到的服务器??服务器有自己的ip如 :201.123.2.2但作为组播服务器它也应该有组播地址啊!如果客户段连接224.2.2.1的组播地址,它怎么找到的这个地址呢!!
xuying
2002-06-22
打赏
举报
回复
组播没有明确的服务器和客户机的概念。任何一台机器向一个组播地址发出数据,其他机器只要说明接收这个组播地址的数据,就都可以接收。你编程序的时候就确定了这个地址了。当然你也可以用配置文件等由用户确定。
看这里:
multicast.imr_multiaddr.s_addr = inet_addr(RECV_IP_ADDR);
multicast.imr_interface.s_addr = htonl(INADDR_ANY);
if (setsockopt(sockfd,IPPROTO_IP,IP_ADD_MEMBERSHIP,(char *)&multicast,sizeof(multicast)) < 0 )
这句就是将sockfd加入一个组播组,接收RECV_IP_ADDR这个组播地址上的数据。
8slob
2002-06-22
打赏
举报
回复
呵呵,谢谢 xuying(),我一定给分但我想你没有明白我的意思
我就想知道客户端怎样找到的组播服务器??凭借TTL的设定?还是其他??
就像网络ip一样,它有一层层的解析可以最终找到你要的ip,可组播ip呢?它是你随意设定的,客户段是怎么找到的呢????
xuying
2002-06-21
打赏
举报
回复
你的客户端在事先要知道服务器发送消息用的组播地址和端口,否则就无法通信了。这和单播的情况一样,只有知道了地址才能通信。
别的系统也使用这个组播地址,如果端口号不同,还是不会有影响,否则两个系统的数据就会互通了。
8slob
2002-06-21
打赏
举报
回复
我设计一个系统把它发布到网上去,用组播方式发送消息,比如用224.1.1.45客户端如何知道怎么找到这个ip?如果说有别的系统的组播也用到这个地址怎么办??
xuying
2002-06-20
打赏
举报
回复
组播地址不用申请的,是保留的。除了一些保留的组播地址,比如224.0.0.1等,其他的你可以直接使用。
组播地址的使用方法看下面的rfc,它规定了哪些地址是保留的,哪些你可以自由使用。
http://www.ietf.org/rfc/rfc2365.txt
http://www.iana.org/assignments/multicast-addresses
RTP是基于udp的,可以组播,也可以广播,看你用什么socket了。
rtp
.rar_UDP
组播
_
rtp
_多路视频传输_应用层
组播
实时传输协议(
RTP
)为数据提供了具有实时特征的端对端传送服务,如在
组播
或单播网络服务下的交互式视频音频或模拟数据。应用程序通常在 UDP 上运行
RTP
以便使用其多路结点和校验服务;这两种协议都提供了传输层协议的功能。但是
RTP
可以与其它适合的底层网络或传输协议一起使用。如果底层网络提供
组播
方式,那么
RTP
可以使用该
组播
表传输数据到多个目的地。
利用FFmpeg实现简单
rtp
推流
利用FFmpeg实现
rtp
推流.重点为时间戳转换.
rtp
/rtcp库源代码
使用J
RTP
LIB库实现
RTP
的传输
RTP
是目前解决流媒体实时传输
问题
的最好办法,如果需要在Linux平台上进行实时流媒体编程,可以考虑使用一些开放源代码的
RTP
库,如LIB
RTP
、J
RTP
LIB等。J
RTP
LIB是一个面向对象的
RTP
库,它完全遵循RFC 1889设计,在很多场合下是一个非常不错的选择
使用
RTP
协议发送和接收H264的例子(支持解码、播放)
MFC实现的窗口程序,集成了发送和接收
RTP
包的功能,接收到的视频用FFmpeg解码并显示出来。该例子代码对应我博客上的一篇文章:https://blog.csdn.net/zhoubotong2012/article/details/86510032
RTP
协议分析及方案
RTP
协议原理及工作机制
RTP
协议关键技术指标
RTP
协议应用方案之单播
RTP
协议应用方案之广播
RTP
协议应用方案之
组播
通信技术
4,356
社区成员
28,926
社区内容
发帖
与我相关
我的任务
通信技术
通信技术相关讨论
复制链接
扫一扫
分享
社区描述
通信技术相关讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章