关于组播和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 打赏 收藏 转发到动态 举报
写回复
用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了。

4,356

社区成员

发帖
与我相关
我的任务
社区描述
通信技术相关讨论
社区管理员
  • 网络通信
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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