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");
exit(1);
}
//數據傳輸處理
ret = sendto(sockfd, snd, strlen(snd), 0, (struct sockaddr *) &my_con, len);
if(ret < 0)
{
perror("send error!\n");
exit(1);
}
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;
}