CubieBoard博客-HomeCubieTech公司网站

CubieBoard中文论坛

 找回密码
 立即注册
搜索
热搜: unable
查看: 8110|回复: 12

利用广播获取CB的IP地址

[复制链接]

29

主题

6

好友

1万

积分

版主

Rank: 7Rank: 7Rank: 7

贡献
1691
金钱
5458
威望
1691
买家信用
卖家信用
积分
10917
发表于 2014-10-5 08:53:43 |显示全部楼层
本帖最后由 soloforce 于 2014-10-6 19:30 编辑

对于无显示器CB Linux系统,且IP地址为动态获取方式时,获取CB系统的IP地址可能是一个令人头疼的问题;然而利用局域网广播方法,则可以让与CB系统位于同一个局域网的其他机器得到CB系统的IP地址,仅仅需要Linux下socket编程的一些知识以及若干行代码。此外,为了适合各种类型的局域网,采用255.255.255.255的广播地址;当然,广播包不会被路由器转发。
===== CB系统代码 =====


  1. /* filename: brdip.c
  2. *
  3. * IP broadcast via UDP
  4. * by soloforce, 2014
  5. */

  6. #include<stdio.h>
  7. #include<stdlib.h>
  8. #include<errno.h>
  9. #include<string.h>
  10. #include<sys/types.h>
  11. #include<netinet/in.h>
  12. #include<sys/socket.h>
  13. #include<sys/wait.h>
  14. #include<sys/stat.h>
  15. #include<fcntl.h>
  16. #include<unistd.h>
  17. #include <arpa/inet.h>
  18. #include<netdb.h>

  19. #define PORT 7777
  20. #define MAXDATASIZE 256

  21. int main(int argc,char *argv[])
  22. {
  23.     int socket_fd;
  24.     struct sockaddr_in my_addr,user_addr;
  25.     char buf[MAXDATASIZE];
  26.     int so_broadcast=1;
  27.     socklen_t size;
  28.     char my_ip[12];
  29.     my_addr.sin_family=AF_INET;
  30.     my_addr.sin_port=htons(PORT);
  31.     my_addr.sin_addr.s_addr=inet_addr("255.255.255.255");
  32.     bzero(&(my_addr.sin_zero),8);

  33.     user_addr.sin_family=AF_INET;
  34.     user_addr.sin_port=htons(PORT);
  35.     user_addr.sin_addr.s_addr=htonl(INADDR_ANY);
  36.     bzero(&(user_addr.sin_zero),8);
  37.     if((socket_fd=(socket(AF_INET,SOCK_DGRAM,0)))==-1) {
  38.         perror("socket");
  39.         exit(1);
  40.     }
  41.     setsockopt(socket_fd,SOL_SOCKET,SO_BROADCAST,&so_broadcast,sizeof(so_broadcast));
  42.     if((bind(socket_fd,(struct sockaddr *)&user_addr,
  43.                         sizeof(struct sockaddr)))==-1) {
  44.         perror("bind");
  45.         exit(1);
  46.     }

  47.     // broadcast a message
  48.     strcpy(buf,"Cubieboard on line!");
  49.     sendto(socket_fd,buf,strlen(buf),0,(struct sockaddr *)&my_addr,sizeof(my_addr));

  50.     // receive the message broadcast just now, to get user_addr which contains the IP info.
  51.     size=sizeof(user_addr);
  52.     recvfrom(socket_fd,buf,MAXDATASIZE,0,(struct sockaddr *)&user_addr,&size);

  53.     // extract the IP info
  54.     bzero(buf, sizeof(buf));
  55.     sprintf(buf, "Cubieboard IP: %s\n",inet_ntoa(user_addr.sin_addr));

  56.     // keep broadcast the IP info in 3 secs.
  57.     while(1) {
  58.         sendto(socket_fd,buf,strlen(buf),0,(struct sockaddr *)&my_addr,sizeof(my_addr));
  59.         sleep(3);
  60.     }
  61.     return 0;
  62. }
复制代码
===== 客户机(Linux系统)代码 =====

  1. /* filename: udprecv.c
  2. *
  3. * receive IP info via UDP
  4. * by soloforce, 2014
  5. */

  6. #include <sys/socket.h>
  7. #include <netinet/in.h>
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10. #include <string.h>

  11. #define PORT 7777
  12. #define MAXDATASIZE 256

  13. int main(int argc, char**argv)
  14. {
  15.    int sockfd,n;
  16.    struct sockaddr_in servaddr,cliaddr;
  17.    socklen_t size;
  18.    char buf[MAXDATASIZE];

  19.    sockfd=socket(AF_INET,SOCK_DGRAM,0);
  20.    bzero(&servaddr,sizeof(servaddr));
  21.    servaddr.sin_family = AF_INET;
  22.    servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
  23.    servaddr.sin_port=htons(PORT);
  24.    bind(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr));

  25.    while(1){
  26.       size = sizeof(cliaddr);
  27.       bzero(buf, sizeof(buf));
  28.       n = recvfrom(sockfd,buf,1000,0,(struct sockaddr *)&cliaddr,&size);
  29.       buf[n] = 0;
  30.       printf("%s",buf);
  31.    }
  32. }

复制代码
===== 编译与执行 =====
分别在CB系统和客户系统中编译程序
  CB $ gcc brdip.c -o brdip
  GUEST $ gcc udprecv.c -o udprecv
分别执行之
  CB $ ./brdip
  GUEST $ ./udprecv
在客户系统中可以看到如下显示
Cubieboard IP: 192.168.1.124

Cubieboard IP: 192.168.1.124

Cubieboard IP: 192.168.1.124

Cubieboard IP: 192.168.1.124

Cubieboard IP: 192.168.1.124

Cubieboard IP: 192.168.1.124

Cubieboard IP: 192.168.1.124

Cubieboard IP: 192.168.1.124

Cubieboard IP: 192.168.1.124

Cubieboard IP: 192.168.1.124
...


已有 1 人评分威望 金钱 贡献 收起 理由
cubieplayer + 5 + 5 + 5 在某些场合下还是很有用的,谢谢分享.

总评分: 威望 + 5  金钱 + 5  贡献 + 5   查看全部评分

回复

使用道具 举报