多播收發程序multicast

最近工作中編寫UDP多播程序,要求能收能發。要求是非常簡單了,但是從來沒有這方面的經驗,於是開始到網上翻,先看看基本的概念,再下載能用的代碼,然後改成自己需要的,凡事都是三段論,三步走。

 

概念:

多播:加入了同一個多播組的主機可以接受到此組內的所有數據,網絡中的交換機和路由器只向有需求者複製並轉發其所需數據。主機可以向路由器請求加入或退出某個組,網絡中的路由器和交換機有選擇的複製並傳輸數據,即只將組內數據傳輸給那些加入組的主機。這樣既能一次將數據傳輸給多個有需要(加入組)的主機,又能保證不影響其他不需要數據(未加入組)主機的其他通訊。

 

代碼:

接下來找代碼,看看多播是什麼效果,有個切身的感受,才能加深理解嘛。上google code search 輸入 “multicast ip_add_membership lang:c|c++ 234.5.6.7” ,搜索的關鍵字裏面加了一個ip地址,是因爲看了別的例子,拿這個ip地址做多播地址,所以就把它也當關鍵字輸進去了,測試了幾個,發現這個好用,簡單http://www.google.cn/codesearch/p?hl=zh-CN#uKFNR_GmXJU/reference/programming/features/multicast/MulticastTest.zip%7CYvUlBXkxhqc/Main.cpp&q=multicast%20ip_add_membership%20lang:c%7Cc++%20234.5.6.7

 

下面是連接提供的代碼,新建一個控制檯工程,粘貼過來就可以用,可能需要在最前面加一行#include "stdafx.h"

 

  

編譯運行,可以收發數據。看上來這個東西可以用啊。關鍵的東西就是加入多播組。

 

修改:

在發送函數bSendMulticast和接收函數bReceiveMulticast上修改,能夠收發我自己的數據了。好啦,有了可以用的代碼,我就有了基礎設施了,可以搭建自己的東西。

 

開展自己的工作:

上面的代碼的讀寫是在一個循環裏面完成,因爲我的任務的要求,要有讀線程,當有數據時調用一個回調函數,寫就不需要另開線程了,主線程裏面檢查有數據則發送,無數據則空轉。

 

 

有人問:socket可以同時讀寫嗎,也就是說我在兩個線程裏面用同一個socket句柄,需要互斥嗎?

答:(非標準答案,請觀衆再自己確認一下)

如果一個是讀線程,一個是寫線程,那就不用互斥了。

如果每個線程裏面既有讀,又有寫,那就好好保護一下吧。(好像沒有這麼幹的,自找麻煩嘛,這不是!)

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章