免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2182 | 回复: 16
打印 上一主题 下一主题

大家帮我看看怎样效率才高,谢谢了 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-12-08 17:33 |只看该作者 |倒序浏览
如题:
在一个配置文件中写到有几段ip地址
192.168.1/24,61.51.50/24,202.205.4.6/27 等等格式的ip地址
现在随便乱给一个ip地址,要求判断它是不是在上面的ip地址段中

想了半天也想不出个好的办发

我也把我的想法说一下,先把配置文件解析出来变成
开始ip: s[1]=192,s[2]=168,s[3]=1,s[4]=0
结束ip : e[1]=192,e[2]=168,e[3]=1,e[4]=255
的这种格式,然后通过sscanf把给出的ip也变成这么四个部分,然后再挨着比大小

可是这样做出来感觉效率好低,大家有没有什么好的办发,听听各位兄弟的意见,谢谢了

论坛徽章:
0
2 [报告]
发表于 2005-12-08 17:46 |只看该作者
这样那。
比如ip为:a.b.c.e
转为为a*255*255*255+b*255*255+c*255+e
之后比较他们的范围就好了。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
3 [报告]
发表于 2005-12-08 19:07 |只看该作者
先按 "/" 分段读出来, (strtoken) . 放入到一个 char [1000][16]; 中.

再用 while 循环,用 strcmp 比较,相同时跳出 while , 同时置一个变量 flag = 1 ;

如果循环完成,依然没有找到相同的, flag 的值保持不变(为假值 = 0 );

论坛徽章:
5
IT运维版块每日发帖之星
日期:2015-08-06 06:20:00IT运维版块每日发帖之星
日期:2015-08-10 06:20:00IT运维版块每日发帖之星
日期:2015-08-23 06:20:00IT运维版块每日发帖之星
日期:2015-08-24 06:20:00IT运维版块每日发帖之星
日期:2015-11-12 06:20:00
4 [报告]
发表于 2005-12-08 19:26 |只看该作者
利用inet_aton函数把第一个和最后一个IP转换成32位数值,比较给定的IP是否大于第一个,并且小于最后一个32位数值,不就可以了吗,然后再看一下掩码.

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
5 [报告]
发表于 2005-12-08 20:10 |只看该作者
子网掩码是用来 做 "与" 运算的.

与一下 就知道了


  1. #include <stdio.h>
  2. #include <sys/socket.h>
  3. #include <netinet/in.h>
  4. #include <arpa/inet.h>

  5. int main(int argc , char *argv[])
  6. {
  7.         char  mask[] = "255.255.255.0", /* 24 */ _ip[] = "192.168.0.1";
  8.         unsigned int x,y,z;

  9.         if(argc!=2)
  10.         {
  11.                 printf("usage :  <1>ip address ");
  12.                 return 0;
  13.         }
  14.         x=inet_addr(_ip);
  15.         y=inet_addr(argv[1]);
  16.         z=inet_addr(mask);
  17.         if((x & z) == (y & z))
  18.                 printf("same\n");
  19.         else
  20.                 printf("differense\n");
  21.         return 0;
  22. }
复制代码

[root@Ora9i tmp]# ./020 192.168.0.3
same
[root@Ora9i tmp]# ./020 192.168.3.2
differense
[root@Ora9i tmp]# ./020 172.20.3.2
differense

论坛徽章:
0
6 [报告]
发表于 2005-12-08 20:17 |只看该作者
mask = 0xffffffff << (32-24);
network = inet_network("192.168.1") << (32-24);
if ((ip & mask) == network)
可以吧

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
7 [报告]
发表于 2005-12-08 20:23 |只看该作者
原帖由 ktdid 于 2005-12-8 20:17 发表
mask = 0xffffffff << (32-24);
network = inet_network("192.168.1") << (32-24);
if ((ip & mask) == network)
可以吧

依稀的记得 (unsigned int)-1 是不无论如何 位移都是(unsigned int)- -1

[ 本帖最后由 mq110 于 2005-12-8 20:51 编辑 ]

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
8 [报告]
发表于 2005-12-08 20:26 |只看该作者
昏..

[ 本帖最后由 mq110 于 2005-12-8 20:51 编辑 ]

论坛徽章:
0
9 [报告]
发表于 2005-12-08 20:45 |只看该作者
是左移,后面空出来的位用0补,不过偶那段好象不对

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
10 [报告]
发表于 2005-12-08 20:46 |只看该作者
hun ....糊涂了..

[ 本帖最后由 mq110 于 2005-12-8 20:51 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP