Linux UDP實現廣播

2021-10-23 05:37:08 字數 2201 閱讀 6080

特點:

較tcp來講udp無需建立連線可以直接傳送訊息,udp是對網路環境完全不彌補的協議,所以使用dup就要允許有一定的丟包率,udp廣播是面向區域網內所有的裝置的。

對比tcp連線時服務端的ip位址的重要性來講,udp廣播中本機的ip顯得並不重要了。

在udp廣播中不同於tcp的我們需要對網路套接字設定其廣播屬性,預設的 網路套接字是不具有廣播屬性的,這裡使用setsockopt函式,對於這函式manpage中無詳細介紹具體使用可以參照unix網路程式設計一捲,我們使用sendto函式將資料報傳送給目標位址為.255的ip位址,當交換機收到我們傳送的資料報時會對其解包,交換機發現ip位址為255時會把資料報傳送到區域網內每乙個主機

傳送端

#include

#include

#include

#include

#include

#include

#include

#include

intmain()

int flag =1;

setsockopt

(lfd, sol_socket, so_broadcast | so_reuseaddr,

&flag,

sizeof

(flag));

caddr.sin_family = af_inet;

caddr.sin_port =

htons

(4001);

caddr.sin_addr.s_addr =

inet_addr

("192.168.10.255");

clen =

sizeof

(caddr)

;int n =

sendto

(lfd, msg,

strlen

(msg),0

,(struct sockaddr *

)&caddr, clen);if

(n <0)

close

(lfd)

;return0;

}

接收端

#include

#include

#include

#include

#include

#include

#include

#include

#include

intmain()

int set =1;

setsockopt

(socklisten, sol_socket, so_reuseaddr,

&set,

sizeof

(int))

;struct sockaddr_in recvaddr;

memset

(&recvaddr,0,

sizeof

(struct sockaddr_in));

recvaddr.sin_family = af_inet;

recvaddr.sin_port =

htons

(4001);

recvaddr.sin_addr.s_addr = inaddr_any;if(

bind

(socklisten,

(struct sockaddr *

)&recvaddr,

sizeof

(struct sockaddr))==

-1)int recvbytes;

char recvbuf[

128]

;int addrlen =

sizeof

(struct sockaddr_in);if

((recvbytes =

recvfrom

(socklisten, recvbuf,

128,0,

(struct sockaddr *

)&recvaddr,

&addrlen))!=

-1)else

close

(socklisten)

;return0;

}

注意在client端中的ip位址繫結不要繫結127.0.0.1,這是本地環迴位址只可以用於一台機器的測試,udp廣播是對於整個區域網通訊的,

linux UDP廣播通訊

2013 02 04 10 18 3881人閱讀收藏 舉報 c 語言 89 linux system 153 在除錯區域網內通過udp協議獲取其他裝置ip位址時,伺服器使用udp 廣播後,客戶端裝置無響應.先研究一下正常情況下,udp廣播通訊方法.參考了網路上一寫資料.整理如下 伺服器端向 255....

Linux UDP廣播報文接收速率問題

專案採用的是3.10.108的kernel,在測試時使用發包功率高速傳送dhcp request報文,發現busybox中的udhcpd 程序狀態為d,抓包看,沒有offer包,而且樣機ping不通。分析發現是在kernel中的函式udp queue rcv skb中 if sk rcvqueues...

linux udp通訊程式

服務端程式為 include include include include include include include int main recvfrom isock,szbuf,sizeof szbuf 1,0,struct sockaddr srvaddr,socklen t srvadd...