求子网掩码的校验函数

dongjiawei316 2011-11-08 09:02:47
给一个字符串,要求判断是否是合法的子网掩码。

char mask_ok[]="255.255.255.0"
char mask_err[]="255.0.255.0"

mask_ok 是合法的,mask_err是非法的。
...全文
187 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
dongjiawei316 2011-11-09
  • 打赏
  • 举报
回复
辛苦了。
Wenxy1 2011-11-08
  • 打赏
  • 举报
回复
搞清楚IP地址分为网络部分+主机部分,还有子网分割即可.
qq120848369 2011-11-08
  • 打赏
  • 举报
回复
一样。。。有inet系列函数。。。专门干掩码的。
qq120848369 2011-11-08
  • 打赏
  • 举报
回复
#include <stdlib.h>
#include <stdio.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>

int checkNetmask(const char *netmask)
{
char bigEdianBytes[4];

if(inet_pton(AF_INET,netmask,bigEdianBytes)<=0)
{
perror("inet_pton");
return -1;
}

bool hasNullBits=false;

for(int i=0;i<4;++i)
{
for(int j=0,k=(1<<7);j<7;++j,k>>=1)
{
bool isSet=k&bigEdianBytes[i];

if(isSet && hasNullBits)
{
return -1;
}
else if(!isSet)
{
hasNullBits=true;
}
}
}

return 0;
}

int main()
{
int n1=checkNetmask("255.255.255.0");
int n2=checkNetmask("0.255.0.255");
int n3=checkNetmask("130.255.255.255");

printf("%d %d %d \n",n1,n2,n3);

return 0;
}
qq120848369 2011-11-08
  • 打赏
  • 举报
回复
哎呀,写出来了才发现原来掩码必须是左边1,右边0,这个问题还是不要当做Long了,会引入本机字节序问题。

直接逐个判断4字节就可以了。

qq120848369 2011-11-08
  • 打赏
  • 举报
回复
[Quote=引用楼主 dongjiawei316 的回复:]
给一个字符串,要求判断是否是合法的子网掩码。
如C/C++ code

char mask_ok[]="255.255.255.0"
char mask_err[]="255.0.255.0"


mask_ok 是合法的,mask_err是非法的。
[/Quote]

哦哦,我懂楼主意思了。。。是要求只能出现1111111111100000000/0000000000111111这种序列。。。

先inet_addr转const char*为4字节网络序。

举例:char mask_ok[]="255.255.255.0" ,inet_addr转化后,也就是[0]字节是255,[3]字节是0.

将这4字节当做unsigned long解析,会根据本机大小端有所不同,但肯定是11111111100000(大端)或者是000000111111111(小端)之中的一种。

怎么判断呢? 从低到高遍历l的每一位,如果当前位和前一位不同,那么找到了分界。 之后判断高位一边是否有不同的bit位即可。

一会写个代码。
mymtom 2011-11-08
  • 打赏
  • 举报
回复
或者

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#include <stdio.h>

int
main(int argc, char *argv[])
{
unsigned int mask;
char mask_good[] = "255.255.255.0";
char mask_bad[] = "255.0.255.0";

mask = inet_addr(mask_good);
if (((~mask + 1) & ~mask) == 0 )
printf("%s\n", "good");
else
printf("%s\n", "bad");

mask = inet_addr(mask_bad);
if (((~mask + 1) & ~mask) == 0 )
printf("%s\n", "good");
else
printf("%s\n", "bad");

return 0;
}
mymtom 2011-11-08
  • 打赏
  • 举报
回复

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <strings.h>

#include <stdio.h>

int
main(int argc, char *argv[])
{

unsigned int mask;
char mask_good[] = "255.255.255.0";
char mask_bad[] = "255.0.255.255";

mask = inet_addr(mask_good);
if ((~mask) >> ffs(mask) == 0)
printf("%s\n", "good");
else
printf("%s\n", "bad");

mask = inet_addr(mask_bad);
if ((~mask) >> ffs(mask) == 0)
printf("%s\n", "good");
else
printf("%s\n", "bad");

return 0;
}

23,217

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧