linux程式設計udp組播

2021-10-23 21:55:25 字數 3983 閱讀 7960

linux程式設計udp通訊

linux程式設計udp廣播

使用範圍

結構體

struct ip_mreqn

struct in_addr

○ 組播位址

224.0.0.0~224.0.0.255

預留的組播位址(永久組位址),位址224.0.0.0保留

不做分配,其它位址供路由協議使用;

224.0.1.0~224.0.1.255

公用組播位址,可以用於internet;欲使用需申請。

224.0.2.0~238.255.255.255

使用者可用的組播位址(臨時組位址),全網範圍內有

效;239.0.0.0~239.255.255.255

本地管理組播位址,僅在特定的本地範圍內有效。

○ 伺服器端操作:

○ 客戶端操作:

組播結構圖

// 繫結server的ip和埠

struct sockaddr_in serv;

memset

(&serv,0,

sizeof

(serv));

serv.sin_family = af_inet;

serv.sin_port =

htons

(8787);

// server埠

serv.sin_addr.s_addr =

htonl

(inaddr_any)

;int ret =

bind

(fd,

(struct sockaddr*

)&serv,

sizeof

(serv));

if(ret ==-1

)// 初始化客戶端位址資訊

struct sockaddr_in client;

memset

(&client,0,

sizeof

(client));

client.sin_family = af_inet;

client.sin_port =

htons

(6767);

// 客戶端要繫結的埠

// 使用組播位址給客戶端發資料

inet_pton

(af_inet,

"239.0.0.10"

,&client.sin_addr.s_addr)

;// 給伺服器開放組播許可權

struct ip_mreqn flag;

// init flag

inet_pton

(af_inet,

"239.0.0.10"

,&flag.imr_multiaddr.s_addr)

;// 組播位址

inet_pton

(af_inet,

"0.0.0.0"

,&flag.imr_address.s_addr)

;// 本地ip

flag.imr_ifindex =

if_nametoindex

("ens33");

setsockopt

(fd, ipproto_ip, ip_multicast_if,

&flag,

sizeof

(flag));

// 通訊

while(1

);sprintf

(buf,

"hello, udp == %d\n"

, num++);

int ret =

sendto

(fd, buf,

strlen

(buf)+1

,0,(

struct sockaddr*

)&client,

sizeof

(client));

if(ret ==-1

)printf

("server == send buf: %s\n"

, buf)

;sleep(1

);}close

(fd)

;return0;

}

#include

#include

#include

#include

#include

#include

#include

#include

intmain

(int argc,

const

char

* ar**)

// 繫結ip和埠

struct sockaddr_in client;

memset

(&client,0,

sizeof

(client));

client.sin_family = af_inet;

client.sin_port =

htons

(6767);

// ........

inet_pton

(af_inet,

"0.0.0.0"

,&client.sin_addr.s_addr)

;int ret =

bind

(fd,

(struct sockaddr*

)&client,

sizeof

(client));

if(ret ==-1

)// 加入到組播位址

struct ip_mreqn fl;

inet_pton

(af_inet,

"239.0.0.10"

,&fl.imr_multiaddr.s_addr)

;inet_pton

(af_inet,

"0.0.0.0"

,&fl.imr_address.s_addr)

; fl.imr_ifindex =

if_nametoindex

("ens33");

setsockopt

(fd, ipproto_ip, ip_add_membership,

&fl,

sizeof

(fl));

// 接收資料

while(1

);int len =

recvfrom

(fd, buf,

sizeof

(buf),0

,null

,null);

if(len ==-1

)printf

("client == recv buf: %s\n"

, buf);}

close

(fd)

;return0;

}

af_inet(又稱 pf_inet)是 ipv4 網路協議的套接字型別,af_inet6 則是 ipv6 的;而 af_unix 則是 unix 系統本地通訊。

選擇 af_inet 的目的就是使用 ipv4 進行通訊。因為 ipv4 使用 32 位位址,相比 ipv6 的 128 位來說,計算更快,便於用於區域網通訊。

而且 af_inet 相比 af_unix 更具通用性,因為 windows 上有 af_inet 而沒有 af_unix。

Linux C C 程式設計 Udp組播(多播)

ip組播通訊必須依賴於ip多播位址,在ipv4中它是乙個d類ip位址,範圍從224.0.0.0到239.255.255.255,並被劃分為區域性鏈結多播位址 預留多播位址和管理許可權多播位址三類 預留多播位址為 224.0.1.0 238.255.255.255,可用於全球範圍 如internet ...

UDP組播接收

網路中的一台主機如果希望能夠接收到來自網路中其它主機發往某乙個組播組的資料報,那麼這麼主機必須先加入該組播組,然後就可以從組位址接收資料報。在廣域網中,還涉及到路由器支援組播路由等,但本文希望以乙個最為簡單的例子解釋清楚協議棧關於組播的乙個最為簡單明瞭的工作過程,甚至,我們不希望涉及到 igmp包。...

udp組播測試

這周主要做了udp組播的測試 伺服器傳送端 include include include include include include include include include include include include include include std string hello...