在拥有多个设备时,如何得知设备是否存在呢?嵌入式设备发送广播包就是一个可行的方案。UDP广播包,打包buf中信息为设备的信息。然后通过UDP广播到网络中。
话不多说,直接给出广播包的源代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <sys/select.h>
#include <sys/types.h>
#include <sys/socket.h>
#define MAXLINE 50
typedef struct sockaddr SA;
int main(int argc, char *argv)
{
int sockfd,ret;
struct sockaddr_in targetaddr;
char buf_snd[MAXLINE] = "Hello, I am 48!";
int broadcast;
if((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
{
perror("socket failed!");
exit(-1);
}
broadcast = 1;
if((ret = setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &broadcast, sizeof(broadcast))) < 0)
{
perror("setsockopt failed");
exit(-1);
}
bzero(&targetaddr, sizeof(targetaddr));
targetaddr.sin_family = AF_INET;
targetaddr.sin_addr.s_addr = htonl(INADDR_BROADCAST);
targetaddr.sin_port = htons(8888);
while(1)
{
sleep(1);
if((ret = sendto(sockfd, buf_snd, sizeof(buf_snd), 0, (SA *)&targetaddr, sizeof(targetaddr))) < 0)
{
perror("sendto failed");
exit(-1);
}
printf("sendto (broadcast) successed\n");
}
return 0;
}
进行arm-linux-gcc交叉编译后,放进开发板运行、发现无法运行?
报了一个网络不存在的错误、用route命令、ifconfig命令看一下网络的状态
广播的功能是有的,但是发现网关的设置却是空的,那么原因就是没有设置网关导致的。
设置网关:
然后再运行
主机端通过wireshark抓包
这样开发板的广播包程序就写好了、
完!