1. 程式人生 > >UDP單播、廣播、多播

UDP單播、廣播、多播

在Linux中使用多播技術,與使用UDP給單個使用者傳送訊息,沒有多大的區別,只是你要使用一個特殊的多播IP地址,還有一些環境需要改變一下。
  一般的網絡卡,都是支援多播技術的,但是作業系統不一定。Linux一般在預設狀態編譯時,可能都不支援Multicast,你需要從新配置和編譯你的核心,使它支援多播,然後你需要使用類似這樣的命令:
route add -net 224.0.0.0 netmask 240.0.0.0 dev lo
  要編譯和配置核心,只是在配置的網路部分選項中選中:enable multicast ip,然後編譯,編輯lilo的配置檔案lilo.conf,就可以搞定。
  在使用多播技術時,除了通常使用的socket函式外,還需要使用getsockopt()和setsockopt() 來支援multicast。你可以執行“man multicast”,看看它的各種選項。編制多播的程式,也分為兩方面,一個是broadcast data的服務程式,另一個是監聽multicast ip 廣播資料的客戶端程式。
  服務程式的編制和普通UDP服務程式的編制一樣,只是在你的sockaddr_in結構的初始化時,賦值給它的sin_addr。s_addr使用inet_addr("224.0.0.1")給一個特殊的Muticast IP值就可以了。
  在客戶端的編制方面,相對複雜一點。一般我們需要先使用gethostbyname,得到伺服器的資訊。然後使用socket(AF_INET,SOCK_DGRAM,0)建立套接字,我們接著呼叫setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&share,sizeof(share)),其中,char share = 1, sockfdsocket建立的套接字,這一步就是允許了多程序共享同一個埠。接著,是通用的bzero(), 給sockaddr_in填入資訊,bind(),下來,我們要通知Linux kernel來的資料是廣播資料,這一步通過給optval付值來搞定,如 optval.imr_multiaddr.s_addr = inet_addr("224.0.0.1"); optval.imr_interface.s_addr = htonl(INADDR_ANY); 先面的這一步,則用來使自己的主機加入一個廣播組: setsockopt(sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &optval, sizeof(command)); 現在,你可以使用recvfrom()來接收多播資料了,當然,最後你還要使用: setsockopt(sockfd, IPPROTO_IP,IP_DROP_MEMBERSHIP, &optval, sizeof(optval)); 來退出多播組。