在區域網中實現多播功能

2021-05-08 04:11:08 字數 3328 閱讀 5762

最近一直在看《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上建立乙個...