?? csdn_文檔中心_在windows系統和vxworks系統上實現ip多播.htm
字號:
year= tmpDate.getYear();
document.write(year);
document.write(".");
document.write(month);
document.write(".");
document.write(date);
// -->
</SCRIPT>
</B> </TD></TR>
<TR bgColor=#999999>
<TD colSpan=3 height=1></TD></TR></TBODY></TABLE>
<TABLE border=0 width=770>
<TBODY>
<TR>
<TD align=middle bgColor=#fafafa class=td1 vAlign=top width=150><BR>
<SCRIPT
src="CSDN_文檔中心_在Windows系統和VxWorks系統上實現IP多播.files/microsoft.js"></SCRIPT>
</TD>
<TD align=middle width=620>
<TABLE bgColor=#eeeeee border=0 cellPadding=0 cellSpacing=0 width=600>
<TBODY>
<TR bgColor=#ffffff>
<TD align=middle height=10 width=50></TD>
<TD align=right><A href="http://www.csdn.net/">CSDN</A> - <A
href="http://www.csdn.net/develop/">文檔中心</A> - <FONT
color=#003399>Visual C++</FONT> </TD></TR>
<TR>
<TD align=middle height=5></TD>
<TD align=middle width=500></TD></TR>
<TR>
<TD align=middle bgColor=#003399 height=10><FONT
color=#ffffff>標題</FONT></TD>
<TD><B> 在Windows系統和VxWorks系統上實現IP多播</B> ydfok(原作)
</TD></TR>
<TR>
<TD align=middle height=5></TD>
<TD align=middle width=500></TD></TR>
<TR>
<TD align=middle bgColor=#003399><FONT color=#ffffff>關鍵字</FONT></TD>
<TD width=500> multicast</TD></TR>
<TR>
<TD align=middle height=5></TD>
<TD align=middle width=500></TD></TR></TBODY></TABLE><!--文章說明信息結束//-->
<TABLE border=0 width=600>
<TBODY>
<TR>
<TD align=left><BR>
<P>在Windows系統和VxWorks系統上實現IP多播</P>
<P>作者 楊登峰
2004/04/24<BR>多播在視頻會議的應用是非常廣的。筆者就學習中得到的體會來與大家共享。<BR>(一)多播概要<BR>多播有控制層面(control
plane),數據層面(control plane)。<BR>(1)控制層面分
有根的(Rooted),無根的(Nonrooted)。有根結點負責多播結點的建立,以及其它結點的加入。無根多播網絡,每個主機在加入組的時候條件都是都是等價的。<BR>(2)數據層面也分有根的,無根的。有根的模型,數據成員只能夠與跟結點交換數據,普通成員之間數據是不可以交換的。而無跟的模型,每個成員之間數據都是可以相互交換。既只要把數據送到多播組,組里面的每個結點都會收到;只要接收多播組的數據,任何一個組成員發送的數據,都會收到。<BR>IP多播在控制層面和數據層面都是無根的。</P>
<P>(二)IP多播<BR>多播的IP地址是D類地址:224.0.0.0~239.255.255.255。其中有一些IP是保留的。比如224.0.0.1表示子網所有系統,224.0.0.2表示子網上所有的路由器。關于這方面RFC1700中有比較詳細的說明。<BR>多播數據在一子網絡內部傳輸時,因為在一個物理層上,主要通過多播的MAC地址來傳輸給子網,而加了多播的主機的網口就會收到響應多播MAC地址的數據包。<BR>多播MAC地址的構成:<BR>47
23 22
0
<BR>______________________________<BR>| 0x01005e | 0 |
多播IP地址后23位
|<BR>|_________|__|__________________|<BR>網口接受到了加入多播組對應MAC地址數據包后,再傳給設備驅動層,驅動層會檢驗數據包是否書本多播地址。因為多播IP是32位,除了開始四位相同,還要28位才能夠完全區分,而MAC地址中只用了28的后23位來區分,必然不能夠做到唯一確定,因此在驅動層要檢驗網落上的數據包是否是主機所加入的多播組數據。我們在創建多播組的時候,要盡量做到后23位不重復,這樣就可以直接在硬件上就可以區分多播了。不要浪費寶貴的CPU時間。</P>
<P>(三)IGMP協議<BR>當路由器接受到多播數據,它必要要知道網絡的哪些主機加了哪些多播組。IGMP就是基于這樣的原因產生的。<BR>(1)當主機加入多播組的時候,就會給路由器發送一個加入多播組的IGMP包。<BR>(2)路由器每隔一段時間就通過發送一個IGMP查詢,來了解當前多播組成員的情況。加入多播組的主機會返回一個IGMP報告。<BR>Internet組管理協議,是為了讓物理網落上的所有系統知道主機所在多播組。<BR>更詳盡的IGMP說明參見RFC
1112[Deering 1989]</P>
<P>(四)實現細節<BR>(1)流程<BR>創建一個SOCKET, 創建一個SOCKET<BR>bind();
bind<BR>加入多播組 加入多播組<BR>sengto(); recvfrom(); <BR>... ...</P>
<P>退出多播組 退出多播組</P>
<P>(2)Window<BR>int ret = WSAStartup( MAKEWORD( 2, 2 ), &wsaData
);<BR>if ( ret != 0 ) {<BR> // deal with the error.<BR>}</P>
<P>m_SockManager = socket( AF_INET, SOCK_DGRAM, 0 );<BR>if(
INVALID_SOCKET == m_SockManager )<BR>{<BR>// deal with the
error.<BR>}</P>
<P>struct sockaddr_in Local_addr_in;<BR>Local_addr_in.sin_family =
AF_INET;<BR>Local_addr_in.sin_port = htons(
m_uPort);<BR>Local_addr_in.sin_addr.s_addr = htonl( INADDR_ANY
);</P>
<P>iError = bind( m_SockManager, (const struct
sockaddr*)&Local_addr_in,\<BR>sizeof(Local_addr_in) );<BR>if(
SOCKET_ERROR == iError )<BR>{<BR>// deal with the error.<BR>}</P>
<P>m_Mcast.imr_interface.s_addr =
INADDR_ANY;<BR>m_Mcast.imr_multiaddr.s_addr =
htonl(m_ipMcastAddr);</P>
<P>iError = setsockopt(m_SockManager, IPPROTO_IP,
IP_ADD_MEMBERSHIP,\<BR>(char *)&m_Mcast,
sizeof(m_Mcast));<BR>if( SOCKET_ERROR == iError )<BR>{<BR>// deal
with the error.<BR>}<BR>//發送多播數據<BR>int iRet = sendto(
m_SockManager, sendBuf, strlen(sendBuf), 0,\<BR>(struct sockaddr
*)&m_Remote, sizeof(m_Remote) );<BR><A href="file://接/"></A><A
href="file://接/"></A>//接收多播數據<BR>int iRet = recvfrom( m_SockManager,
recvBuf, iLenBuf, 0,<BR>(struct sockaddr *)&SockFrom,
&iLenData );<BR>if( SOCKET_ERROR == iRet )<BR>{<BR>// deal with
the error.<BR>}<BR>其中,多播的端口,要根據發送的遠端地址來確定。接收端再響應協調。</P>
<P>(3)VxWorks<BR>Vxworks與上面WinSock1.1基本上都是一樣的。<BR>但是在bind()的時候,VxWorks系統本機的IP只能設置為INADDR_ANY,否則綁定失敗(網上看到,風河公司已經Fix了這個
BUG了)。不過可以在綁定后調用SetSockopt()來指定本地的interface.<BR>struct in_addr
in_if;<BR>in_if.s_addr =
inet_addr("10.9.1.25");//具體的本地的地址,可根據情況而定.<BR>setsockopt(
sockManager, IPPROTO_IP, IP_MULTICAST_IF, (char*)&in_if,
sizeof(in_if));</P>
<P>本文所附Demo實例程序,Windows版在vc6.0開發環境Win2K professional
SP4上實現。VxWorks版本在Tornado 2.0開發環境,公司內部的VxWorks操作系統上實現。</P>
<P>因學疏才淺,不當之處歡迎指出: <A
href="mailto:dengfengyang@hotmail.com">dengfengyang@hotmail.com</A><BR></P><BR></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE><BR>
<TABLE align=center bgColor=#006699 border=0 cellPadding=0 cellSpacing=0
width=770>
<TBODY>
<TR bgColor=#006699>
<TD align=middle bgColor=#006699 id=white><FONT
color=#ffffff>對該文的評論</FONT></TD>
<TD align=middle>
<SCRIPT
src="CSDN_文檔中心_在Windows系統和VxWorks系統上實現IP多播.files/readnum.htm"></SCRIPT>
</TD></TR></TBODY></TABLE><BR>
<DIV align=center>
<TABLE align=center bgColor=#cccccc border=0 cellPadding=2 cellSpacing=1
width=770>
<TBODY>
<TR>
<TH bgColor=#006699 id=white><FONT
color=#ffffff>我要評論</FONT></TH></TR></TBODY></TABLE></DIV>
<DIV align=center>
<TABLE border=0 width=770>
<TBODY>
<TR>
<TD>你沒有登陸,無法發表評論。 請先<A
href="http://www.csdn.net/member/login.asp?from=/Develop/read_article.asp?id=27250">登陸</A>
<A
href="http://www.csdn.net/expert/zc.asp">我要注冊</A><BR></TD></TR></TBODY></TABLE></DIV><BR>
<HR noShade SIZE=1 width=770>
<TABLE border=0 cellPadding=0 cellSpacing=0 width=500>
<TBODY>
<TR align=middle>
<TD height=10 vAlign=bottom><A
href="http://www.csdn.net/intro/intro.asp?id=5">廣告服務</A> - <A
href="http://www.csdn.net/map/map.shtm">網站地圖</A> - <A
href="http://www.csdn.net/help/help.asp">幫助信息</A> - <A
href="http://www.csdn.net/intro/intro.asp?id=2">聯系方式</A> - <A
href="http://www.csdn.net/english">English</A> </TD>
<TD align=middle rowSpan=3><A
href="http://www.hd315.gov.cn/beian/view.asp?bianhao=010202001032100010"><IMG
border=0 height=48
src="CSDN_文檔中心_在Windows系統和VxWorks系統上實現IP多播.files/biaoshi.gif"
width=40></A></TD></TR>
<TR align=middle>
<TD vAlign=top>百聯美達美公司 版權所有 京ICP證020026號</TD></TR>
<TR align=middle>
<TD vAlign=top><FONT face=Verdana>Copyright © CSDN.net, Inc. All rights
reserved</FONT></TD></TR>
<TR>
<TD height=15></TD>
<TD></TD></TR></TBODY></TABLE></DIV>
<DIV></DIV><!--內容結束//--><!--結束//--></BODY></HTML>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -