最近一直在看《unix網路程式設計》這本書,覺得這本書很適合初學socket程式設計的人(比如說我自己 ^_^ )。我一直對於多播的實現比較模糊,在看了書上的多播部分的介紹,才發現在程式中實現乙個基本的多播功能是如此簡單。
在這裡我不想照本宣科的大說什麼理論,概念的東東,我的目的是說明在我們的**中如何實現多播功能。
開發環境: vc 6.0(sp5), 使用winsock2(ws2_32.lib)
測試環境: 三颱機器位於兩個不同的ad域中,所有機器都是windows 2000(sp4)的作業系統。 sz09和kenfilweb4位於域kenfilszwin2k, kenfil-sz18是域sz18-domain域的一台dc。
對於區域網來說,我們可以使用的多播位址為224.0.0.0-224.0.0.255(想知道為什麼?看看書吧。:-) )
多播是通過設定套介面(socket, 來自書上的翻譯)選項來實現的,這個套介面必須是乙個udp的套介面
ip_add_membership: 加入乙個多播組
ip_drop_membership: 離開乙個多播組
ip_multicast_if: 指定外出多播資料報的外出介面
ip_multicast_ttl: ttl數
ip_multicast_loop: 是否禁止回饋,我的理解是一台機器是否可以接收到自己傳送的多播資料報在設定ip_add_membership和ip_drop_membership 選項的時候,我們需要用到ip_mreq結構, 要使用此結構,你必須include , 並確保此include位於include 之下
程式功能:程式讀取使用者輸入的行傳送到多播組,加入多播組的任何客戶端應該顯示從多播組中讀到的資料。
實現**如下:
//project setting -> c/c++ -> code generation -> 確認選中"debug multithreaded"
#include
#include //注意這裡的include檔案順序
#include
#include //_beginthread要求
#pragma comment(lib, "ws2_32.lib")
using namespace std;
const char* multicast_ip = "224.0.0.99"; //多播組位址
const int multicast_port = 2002; //多播組埠
const int buffer_size = 1024;
void do_send(void* arg); //讀取使用者輸入併發送到多播組執行緒函式
void do_read(void* arg); //讀物多播組資料函式
int main()
socket server;
server = socket(af_inet, sock_dgram, 0); //建立乙個udp套介面
cout<<"create socket: "<
int ret ;
const int on = 1; //允許程式的多個例項執行在同一臺機器上
ret = setsockopt(server, sol_socket, so_reuseaddr, (char *)&on, sizeof(on));
if( ret == socket_error )
const int routenum = 10;
ret = setsockopt(server,ipproto_ip,ip_multicast_ttl,/
(char*)&routenum,sizeof(routenum));
if( ret == socket_error )
const int loopback = 0; //禁止回饋
ret = setsockopt(server,ipproto_ip,ip_multicast_loop,/
(char*)&loopback,sizeof(loopback));
if( ret == socket_error )
sockaddr_in local;
memset(&local, 0, sizeof(local));
local.sin_family = af_inet;
local.sin_port = htons(multicast_port);
local.sin_addr.s_un.s_addr = inaddr_any;
ret = bind(server, (sockaddr*)(&local), sizeof(local));
if( ret == socket_error )
ip_mreq mreq;
memset(&mreq, 0, sizeof(mreq));
mreq.imr_inte***ce.s_un.s_addr = inaddr_any;
mreq.imr_multiaddr.s_un.s_addr = inet_addr(multicast_ip);
//加入乙個多播組
ret = setsockopt(server,ipproto_ip,ip_add_membership,/
(char*)&mreq,sizeof(mreq));
if( ret == socket_error )
//建立了兩個執行緒,乙個讀使用者輸入並傳送,乙個讀多播組資料
handle hhandle[2];
hhandle[0] = (handle)_beginthread(do_send,0,(void*)server);
hhandle[1] = (handle)_beginthread(do_read,0,(void*)server);
//如果使用者輸入結束,程式就終止了
waitforsingleobject(hhandle[0], infinite);
wsacleanup();
return 0;
}void do_send(void* arg)
cout<<"do_send end..."<}
void do_read(void* arg)
else if( ret == socket_error )
buf[ret] = '/0';
cout<<"received: "< }
cout<<"do_read end..."<}
當然上面的**如果應用到實際的程式中還需要作更多的工作,不過實現多播功能真的很簡單,不是嗎 :-)
我只是剛剛才開始學習網路程式設計方面的東東,上面的**如果你認為有什麼問題,請直接發email給我。
參考資料: 《unix網路程式設計(第一卷) 套介面api和x/open傳輸介面api》[美] w.richard stevens 著
在區域網中實現多播功能
最近一直在看 unix網路程式設計 這本書,覺得這本書很適合初學socket程式設計的人 比如說我自己 我一直對於多播的實現比較模糊,在看了書上的多播部分的介紹,才發現在程式中實現乙個基本的多播功能是如此簡單。在這裡我不想照本宣科的大說什麼理論,概念的東東,我的目的是說明在我們的 中如何實現多播功能...
巧用區域網進行GHOST多播裝系統
所謂ghost的多播功能,實際上就是把你 樣機 中的.gho自動地恢復到你的所有工作站中去,特別是在各工作站配置相同的情況下,可以大大減輕組網者的工作量。以下,就由筆者帶你一步步地來實現它。說明 工作站端網絡卡均以rtl8139為例!伺服器端網絡卡可為任意。一 安裝ghost 6.0 當安裝完成後,...
windows下實現Git在區域網使用
摘要 1.首先在主機a上建立乙個資料夾用於存放你要公開的版本庫。然後進入這個資料夾,右鍵 git create repository here,彈出的視窗中勾選make it bare!之後將這個資料夾完全共享 共享都會吧?注意許可權要讓使用這個資料夾的使用者為 完全控制 1.首先在主機a上建立乙個...