1. 程式人生 > >《Linux網路程式設計》: UDP廣播程式設計

《Linux網路程式設計》: UDP廣播程式設計

1. 關於廣播請參考 

《TCP/IP協議族》:多播和廣播地址 

《TCP/IP協議族》:單播、廣播、多播(組播)

 

2.  UDP廣播介紹

廣播只能用 UDP 或原始IP實現,不能用 TCP

UDP 廣播特點如下:

  • 處於同一子網的所有主機都必須處理資料。
  • UDP 資料包會沿協議棧向上一直到 UDP 層,因為到 UDP 層,埠不匹配的話,資料才會丟棄,如下圖,所以,執行音視訊等較高速率工作的應用,會帶來較大的負擔。

3. 廣播示例使用

預設的情況下,不允許傳送廣播資料包

,需要修改套介面選項:

int setsockopt( int sockfd, int level, int optname,const void *optval,socklen_t optlen);

功能:設定套接字選項

引數:

sockfd:套接字

其它引數說明如下:

注意:optval的值應該這樣填,定義一個賦值為 1 的整型變數,int opt=1, 然後把這個變數的地址放這個位置,如:&opt

返回值:

成功執行返回0,否則返回-1

使用例子如下:

//設定該套接字為廣播型別
int opt=1;
setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &opt, sizeof(opt));

下面我們寫一個 UDP 廣播發送資料包例子,目的埠指定為 8000,目的 IP 為受限廣播地址:255.255.255.255,那樣,同一個區域網的所有主機網絡卡都會收到這個資料,但是,只有埠為 8000 的網路應用程式才會收到這個資料包:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
 
int main(int argc, char *argv[])
{
	unsigned short port = 8000;				// 埠
	char *server_ip = "255.255.255.255";	// 受限廣播地址
 
	int sockfd;
	sockfd = socket(AF_INET, SOCK_DGRAM, 0);    	//建立UDP套接字
	if(sockfd < 0)
	{
		perror("socket");
		exit(-1);
	}
	
	struct sockaddr_in dest_addr;
	bzero(&dest_addr, sizeof(dest_addr));
	dest_addr.sin_family = AF_INET;
	dest_addr.sin_port   = htons(port);
	inet_pton(AF_INET, server_ip, &dest_addr.sin_addr);
 
	printf("send data to UDP server %s:%d!\n", server_ip, port);
	
	//設定該套接字為廣播型別,這個很重要
	int opt=1;
	setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &opt, sizeof(opt));
	
	char send_buf[512] = "this is a broadcast data";
	sendto(sockfd, send_buf, strlen(send_buf), 0, (struct sockaddr*)&dest_addr, sizeof(dest_addr));//傳送資料
 
	close(sockfd);
	
	return 0;
}

編譯執行如下: