最近工作中編寫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句柄,需要互斥嗎?
答:(非標準答案,請觀衆再自己確認一下)
如果一個是讀線程,一個是寫線程,那就不用互斥了。
如果每個線程裏面既有讀,又有寫,那就好好保護一下吧。(好像沒有這麼幹的,自找麻煩嘛,這不是!)