2013-02-04 10:18
3881人閱讀收藏
舉報
c 語言(89)
linux system(153)
在除錯區域網內通過udp協議獲取其他裝置ip位址時,伺服器使用udp 廣播後, 客戶端裝置無響應. 先研究一下正常情況下, udp廣播通訊方法. 參考了網路上一寫資料. **整理如下:
伺服器端向: 255.255.255.255:6023傳送udp廣播:
serverudp.c
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define port 6023
int main()
const int opt = 1;
//設定該套接字為廣播型別,
int nb = 0;
nb = setsockopt(sock, sol_socket, so_broadcast, (char *)&opt, sizeof(opt));
if(nb == -1)
struct sockaddr_in addrto;
bzero(&addrto, sizeof(struct sockaddr_in));
addrto.sin_family=af_inet;
addrto.sin_addr.s_addr=htonl(inaddr_broadcast);
addrto.sin_port=htons(port);
int nlen=sizeof(addrto);
while(1)
; int ret=sendto(sock, smsg, strlen(smsg), 0, (struct sockaddr*)&addrto, nlen);
if(ret<0)
else
} return 0;
} 客戶端接收廣播訊息.
clientudp.c
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define port 6023
int main()
const int opt = 1;
//設定該套接字為廣播型別,
int nb = 0;
nb = setsockopt(sock, sol_socket, so_broadcast, (char *)&opt, sizeof(opt));
if(nb == -1)
if(bind(sock,(struct sockaddr *)&(addrto), sizeof(struct sockaddr_in)) == -1)
int len = sizeof(struct sockaddr_in);
char smsg[100] = ;
while(1)
else
sleep(1);
} return 0;
} makefile:
all: server client
server:
gcc serverudp.c -o serverudp
client:
gcc clientudp.c -o clientudp
clean:
rm serverudp clientudp
如區域網內有a裝置, ip為192.168.1.100, b裝置, ip為192.168.1.101.
在a裝置上執行 ./clientudp &
在b裝置上執行 ./serverudp &
執行結果:
a裝置上一直列印: abcdef
b裝置上一直列印: ok.
Linux UDP實現廣播
特點 較tcp來講udp無需建立連線可以直接傳送訊息,udp是對網路環境完全不彌補的協議,所以使用dup就要允許有一定的丟包率,udp廣播是面向區域網內所有的裝置的。對比tcp連線時服務端的ip位址的重要性來講,udp廣播中本機的ip顯得並不重要了。在udp廣播中不同於tcp的我們需要對網路套接字設...
linux udp通訊程式
服務端程式為 include include include include include include include int main recvfrom isock,szbuf,sizeof szbuf 1,0,struct sockaddr srvaddr,socklen t srvadd...
Linux UDP廣播報文接收速率問題
專案採用的是3.10.108的kernel,在測試時使用發包功率高速傳送dhcp request報文,發現busybox中的udhcpd 程序狀態為d,抓包看,沒有offer包,而且樣機ping不通。分析發現是在kernel中的函式udp queue rcv skb中 if sk rcvqueues...