CubieBoard中文论坛

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

FindCb,寻找你的cb

[复制链接]
发表于 2013-10-18 22:27:38 | 显示全部楼层 |阅读模式
当我还是新手的时候,我就已经懂得ip是个啥玩意了。
但是当很多人还是新手的时候,不懂啥是ip。
也不知道cb的IP是多少。
于是我写了个程序,通过向同样ip区段的ip的特定端口发送socket以确定是否是cb
It's called "FindCb"(这句话有语法错误不……)
好了好了,上代码,这是cb端的,可以在/etc/rc.local里面的exit 0前加上这个的启动程序:
  1. #include <stdlib.h>
  2. #include <sys/types.h>
  3. #include <stdio.h>
  4. #include <sys/socket.h>
  5. #include <netinet/in.h>
  6. #include <string.h>
  7. const char txt[] = "I am a Cb\n";
  8. int main()
  9. {
  10.     int sfp,nfp;
  11.     struct sockaddr_in s_add,c_add;
  12.     int sin_size;
  13.     unsigned short portnum=5910;
  14.     printf("FindCb:Start FindCb program!\n");
  15.     sfp = socket(AF_INET, SOCK_STREAM, 0);
  16.     if(-1 == sfp)
  17.     {
  18.         printf("socket fail ! \n");
  19.         return -1;
  20.     }
  21.     //printf("socket ok !\n");
  22.    
  23.     bzero(&s_add,sizeof(struct sockaddr_in));
  24.     s_add.sin_family=AF_INET;
  25.     s_add.sin_addr.s_addr=htonl(INADDR_ANY);
  26.     s_add.sin_port=htons(portnum);
  27.    
  28.     if(-1 == bind(sfp,(struct sockaddr *)(&s_add), sizeof(struct sockaddr)))
  29.     {
  30.         printf("bind fail !\n");
  31.         return -1;
  32.     }
  33.     //printf("bind ok !\n");
  34.    
  35.     if(-1 == listen(sfp,5))
  36.     {
  37.         printf("listen fail !\n");
  38.         return -1;
  39.     }
  40.     //printf("listen ok\n");
  41.     while(1)
  42.     {
  43.         sin_size = sizeof(struct sockaddr_in);
  44.         
  45.         nfp = accept(sfp, (struct sockaddr *)(&c_add), &sin_size);
  46.         if(-1 == nfp)
  47.         {
  48.             printf("accept fail !\n");
  49.             return -1;
  50.         }
  51.         printf("FindCb:Get a connect from %x : %d\n",ntohl(c_add.sin_addr.s_addr),ntohs(c_add.sin_port));
  52.         
  53.         if(-1 == write(nfp,txt,sizeof(txt)))
  54.         {
  55.             printf("write fail!\n");
  56.             return -1;
  57.         }
  58.         //printf("write ok!\n");
  59.         close(nfp);
  60.     }
  61.     close(sfp);
  62.     return 0;
  63. }
复制代码
然后这是服务端的,我用的是mac系统,其中获取本机ip用的是ipconfig的手法,popen去执行ipconfig和grep等,返回无线网络的ip,有线mac网络改成en0,linux的话改成 ifconfig eth0|grep 'inet addr:'|cut -d: -f2 | awk '{ print $1}'
,好了,code:
  1. #include <stdlib.h>
  2. #include <sys/types.h>
  3. #include <stdio.h>
  4. #include <sys/socket.h>
  5. #include <netinet/in.h>
  6. #include <string.h>
  7. #include <unistd.h>

  8. #define TIMEOUT_TIME 1
  9. /*
  10. By TLL,but most of the codes are from the web
  11. */
  12. int cfd;
  13. void alarm_func(){
  14.     printf("Timeout!\n");
  15.     close(cfd);
  16. }
  17. int main()
  18. {
  19. int recbytes;
  20. int sin_size;
  21. int i = 100;
  22. int hb = 0;
  23. char buffer[1024]={0};   
  24. struct sockaddr_in s_add,c_add;
  25. unsigned short portnum=5910;
  26. signal(SIGALRM, alarm_func);
  27. printf("Hello,welcome to client !\n");
  28. FILE *ipf=popen("ifconfig en1|grep broadcast|awk '{ print $2}'","r");
  29.     //For mac,wireless network
  30. char search_ip[16] = "";
  31. char get_ip[16] = "";
  32. char qz[16] = "";
  33. char delim[4] = "";
  34. fgets(get_ip, sizeof(get_ip), ipf);
  35. pclose(ipf);
  36.     get_ip[strlen(get_ip)-1] = '\0';
  37.     printf("Your IP:%s\n",get_ip);
  38.     strcat(qz,strtok(get_ip,"."));
  39.     qz[strlen(qz)]='.';
  40.     strcat(qz,strtok(NULL,"."));
  41.     qz[strlen(qz)]='.';
  42.     strcat(qz,strtok(NULL,"."));
  43.     qz[strlen(qz)]='.';
  44.     qz[strlen(qz)]='\0';
  45.     //printf("qz:%s\n",qz);
  46.     /*
  47.      ping 100 first,then to 255,then 1,then to 99,then exit
  48.      */
  49.     while(hb<2){
  50. while(255 > i){
  51. sprintf(search_ip,"%s%d",qz,i++);
  52.     //if(i == 106) continue;
  53.     //For test(skip my Cb and test ...)
  54.     printf("Trying:%s\n",search_ip);
  55. cfd = socket(AF_INET, SOCK_STREAM, 0);
  56. if(-1 == cfd)
  57. {
  58.     printf("socket fail ! \n");
  59.     return -1;
  60. }
  61. //printf("socket ok !\n");

  62. bzero(&s_add,sizeof(struct sockaddr_in));
  63. s_add.sin_family=AF_INET;
  64. s_add.sin_addr.s_addr= inet_addr(search_ip);
  65. s_add.sin_port=htons(portnum);
  66. //printf("s_addr = %x ,port : %d\n",s_add.sin_addr.s_addr,s_add.sin_port);
  67. alarm(TIMEOUT_TIME);
  68. if(-1 == connect(cfd,(struct sockaddr *)(&s_add), sizeof(struct
  69. sockaddr)))
  70. {
  71.     alarm(0);
  72.     printf("connect fail !\n");
  73.     if(i == 100 && hb == 1){
  74.         return 1;
  75.     }
  76.     continue;
  77. }
  78. printf("Connected!\nSpend Time:%d\n",TIMEOUT_TIME-alarm(0));
  79. //printf("connect ok !\n");

  80. if(-1 == (recbytes = read(cfd,buffer,1023)))
  81. {
  82.     printf("read data fail !\n");
  83.     continue;
  84. }
  85. //printf("read ok\n");
  86. buffer[recbytes]='\0';
  87. if(strcmp(buffer,"I am a Cb\n") == 0){
  88.     printf("Find a Cb!\n");
  89.     printf("It's IP is:%s\n",search_ip);
  90.     return 0;
  91. }
  92. printf("%s\n",buffer);
  93. close(cfd);
  94.     if(i == 100 && hb == 1){
  95.         return 1;
  96.     }
  97. }
  98.         hb++;
  99.         i=1;
  100.     }
  101. return 0;
  102. }
复制代码
编译执行~
另外client我特别让他从100开始搜索,因为100一般是dhcp的开始数,所以比较容易找到。
log(client):
  1. TlldeMacBook-Pro:findcb tonylianlong$ ./findcb
  2. Hello,welcome to client !
  3. Your IP:192.168.1.103
  4. Trying:192.168.1.100
  5. connect fail !
  6. Trying:192.168.1.101
  7. Timeout!
  8. connect fail !
  9. Trying:192.168.1.102
  10. Timeout!
  11. connect fail !
  12. Trying:192.168.1.103
  13. connect fail !
  14. Trying:192.168.1.104
  15. Timeout!
  16. connect fail !
  17. Trying:192.168.1.105
  18. Connected!
  19. Spend Time:0
  20. Find a Cb!
  21. It's IP is:192.168.1.105
  22. TlldeMacBook-Pro:findcb tonylianlong$
复制代码
Server:
  1. root@cubieboard:~/source_code/findcb# ./findcb
  2. FindCb:Start FindCb program!
  3. FindCb:Get a connect from c0a80167 : 53419
复制代码
回复

使用道具 举报

发表于 2013-11-5 03:03:17 | 显示全部楼层
题目不大,有料,好贴。。。
回复 支持 反对

使用道具 举报

发表于 2013-11-6 17:01:59 | 显示全部楼层
查看路由器的dhcp列表难道不是更方便的办法?虽然……好吧,当你不是wifi admin的时候
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-11-7 18:40:22 | 显示全部楼层
gcd0318 发表于 2013-11-6 17:01
查看路由器的dhcp列表难道不是更方便的办法?虽然……好吧,当你不是wifi admin的时候 ...

当然,很多用户不知道自己的路由器用户密码,可能不是自己设置的
回复 支持 反对

使用道具 举报

发表于 2013-11-8 16:59:40 | 显示全部楼层
tll 发表于 2013-11-7 18:40
当然,很多用户不知道自己的路由器用户密码,可能不是自己设置的

这种用户往往也不知道dhcp是从2开始还是从100开始
而且其实,绝大多数只要设置好主机名,ping一下ip就出来了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-11-8 17:25:53 | 显示全部楼层
gcd0318 发表于 2013-11-8 16:59
这种用户往往也不知道dhcp是从2开始还是从100开始
而且其实,绝大多数只要设置好主机名,ping一下ip就出 ...

没关系,一个一个来,只要是同一个路由,就能搜出来
回复 支持 反对

使用道具 举报

发表于 2013-11-8 23:37:38 | 显示全部楼层
tll 发表于 2013-11-8 17:25
没关系,一个一个来,只要是同一个路由,就能搜出来

你的最新版呢? 不是说弄好了没发布啊?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-11-10 08:17:20 | 显示全部楼层
gsoft 发表于 2013-11-8 23:37
你的最新版呢? 不是说弄好了没发布啊?

现在最麻烦的是,mac os和linux的ip获取方式不同!
回复 支持 反对

使用道具 举报

发表于 2013-11-10 11:46:55 | 显示全部楼层
。。。。。mac不是posix兼容么。。socket函数不一样?
回复 支持 反对

使用道具 举报

发表于 2013-11-12 16:34:40 | 显示全部楼层
指的是命令要修改吗?话说shell确实可能遭遇这个
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|粤ICP备13051116号|cubie.cc---深刻的嵌入式技术讨论社区

GMT+8, 2024-11-22 19:13 , Processed in 0.027538 second(s), 15 queries .

Powered by Discuz! X3.4

© 2001-2012 Comsenz Inc. | Style by Coxxs

返回顶部