天天看點

UDP 收/發 廣播包

網絡通信基礎

如果網絡中兩個主機上的應用程式要互相通信,其一要知道彼此的IP,其二要知道程式可監聽的端口。因為同一主機上的程式使用網絡是通過端口号來區分的。

UDP Socket的使用過程:

1. 初始化網絡庫

2. 建立SOCK_DGRAM類型的Socket。

3. 綁定套接字。

4. 發送、接收資料。

5. 銷毀套接字。

6. 釋放網絡庫。

廣播資料包的原理:

專門用于同時向網絡中所有工作站進行發送的一個位址叫做廣播位址。在使用TCP/IP 協定的網絡中,主機辨別段host ID 為全1 的IP 位址為廣播位址。如果你的IP為:192.168.1.39,子網路遮罩為:255.255.255.0,則廣播位址為:192.168.1.255;如果IP為192.168.1.39,子網路遮罩為:255.255.255.192,則廣播位址為:192.168.1.63。

如果隻想在本網絡内廣播資料,隻要向廣播位址發送資料包即可,這種資料包可以被路由,它會經由路由器到達本網段内的所有主機,此種廣播也叫直接廣播;如果想在整個網絡中廣播資料,要向255.255.255.255發送資料包,這種資料包不會被路由,它隻能到達本實體網絡中的所有主機,此種廣播叫有限廣播。

使用UDP協定發送、接收廣播包的過程。

假如我們要向192.168.0.X,子網路遮罩為:255.255.255.0的子網中發送廣播包。

其步驟如下:

1. 初始化Winsock庫。

2. 建立SOCK_DIRAM類型的Socket。

3. 設定Socket的屬性允許其廣播。

4. 發送資料包到192.168.0.255

5. 接收自己廣播的廣播包。

6. 關閉Socket

7. 釋放網絡庫。

注意事項如下:

1. 接收方一定要知道廣播方的口号,然後綁定此端口号才能正确接收。

2. 接收方的Socket不需要設定成廣播屬性。

3. 綁定的IP不可以使用“127.0.0.1”,可以使用真實IP位址或者INADDR_ANY。否則接收失敗。

參考代碼:

#include <stdio.h>

#include <sys/socket.h>

#include <netinet/in.h>

#include <string.h>

#include <stdlib.h>

#include <unistd.h>

//*-----------變量,資料類型宏定義-------------------

#define PORT 3387

#define MAX 255

int main(void)

{

int sockfd, ret;

int size, len;

int so_broadcast=1;

struct sockaddr_in my_con;

struct sockaddr_in cl_con;

char snd[MAX] = "123456789";

char rec[MAX];

//建立socket

sockfd = socket(AF_INET, SOCK_DGRAM, 0);

if(sockfd < 0)

perror("socket error!\n");

exit(1);

}

//建立套接口

my_con.sin_family = AF_INET;

my_con.sin_port = ntohs(PORT);

my_con.sin_addr.s_addr = inet_addr("192.168.1.255");

len = sizeof(struct sockaddr);

setsockopt(sockfd,SOL_SOCKET,SO_BROADCAST,&so_broadcast,sizeof(so_broadcast));

//綁定套接口

if(bind(sockfd, (struct sockaddr *) &my_con, len) < 0)

perror("bind error!\n");

//資料傳輸處理

ret = sendto(sockfd, snd, strlen(snd), 0, (struct sockaddr *) &my_con, len);

if(ret < 0)

perror("send error!\n");

printf("發送廣播資料:%s\n",snd);

size=sizeof(cl_con);

ret = recvfrom(sockfd,rec,MAX,0,(struct sockaddr *)&cl_con,&size);

rec[ret] = '\0';

printf("接收廣播資料:%s\n",rec);

close(sockfd);

return 0;

繼續閱讀