Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4828659
  • 博文数量: 930
  • 博客积分: 12070
  • 博客等级: 上将
  • 技术积分: 11448
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-15 16:57
文章分类

全部博文(930)

文章存档

2011年(60)

2010年(220)

2009年(371)

2008年(279)

分类: LINUX

2009-08-07 16:52:58

Security公司的网络管理工程师Mr.leak最近发现有不少来自公司外部IP的请求,试图非法访问公司内部资源,为了不影响数据访问流程。他不得 不写一个高效的程序——一个工作在Ipv4上的防火墙,如果请求来自非授权的ip地址,则将请求丢弃。为了便于管理,通过文本文件IP.TXT来配置授权 的IP地址,文件格式为每行('\n')一个IP地址(或IP段),范围不超过一个B类。

例如:

162.105.91.163

59.66.105.0 59.66.105.255

211.71.0.0 211.71.255.255

限制:

IP段的起止地址间以空格隔开。文件不超过10万行,内存不超过4M字节。

要求:

请编写一个程序,读入IP.TXT文件。并从标准输入接受一个IP地址。如果该地址在授权范围内,则在标准输出上打印Y,否则打印N。如果输入为一个空行,程序结束。

#include <stdio.h>
#include <stdlib.h>
#include <winsock.h>

#define MAX_LEN 50

typedef unsigned int uint;

typedef struct list
{
  uint ip_begin;
  uint ip_end;
  struct list* next;
}LIST;

void init_list(LIST** L)
{
  *L = (LIST*)malloc(sizeof(LIST));
  (*L)->ip_begin = 0;
  (*L)->ip_end = 0;
  (*L)->next = NULL;
}

int find_space(char* buf)
{
  int count = 0;
  while(*buf)
   {
     if(*buf == ' ')
      {
        return count;
      }
     count++;
     buf++;
   }
   return 0;
}

int process_file(FILE* fp,LIST* L)
{
  char buf[MAX_LEN];
  int space_locate = 0;
  int len;
  while(1)
  {
    if(fgets( buf, MAX_LEN, fp)!=NULL)
      {
        space_locate = find_space(buf);
        len = strlen(buf);
        buf[len-1] = '\0';
        LIST* p = L;
           
        if(space_locate == 0)
         {
           LIST* node = (LIST*)malloc(sizeof(LIST));
           node->ip_begin = inet_addr(buf);
           node->ip_end = node->ip_begin;
           while( p->next&& p->next->ip_begin<node->ip_begin)
               p = p->next;
               
           node->next = p->next;
           p->next = node;
          }
        else
         {
          LIST* node = (LIST*)malloc(sizeof(LIST));
          printf("str is %s",buf);
          buf[space_locate] = '\0';
          node->ip_begin = inet_addr(buf);
          node->ip_end = inet_addr(buf+space_locate+1);
          
         while( p->next&& p->next->ip_begin<node->ip_begin)
               p = p->next;
          node->next = p->next;
          p->next = node;
         }
      }
    else
      break;
  }
}

void print_list(LIST* L)
{
  LIST* p = L->next;
  while(p!=NULL)
   {
     printf("start:%u\tend:%u\n", p->ip_begin, p->ip_end);
     p = p->next;
   }
}

int judge(uint input_ip, LIST* L)
{
  LIST* p = L->next;
  while(p!=NULL)
   {
     if(p->ip_begin <= input_ip)
      {
        if(p->ip_end >= input_ip)
          return 1;
        else
           return 0;
      }
      p = p->next;
    }
   return 0;
}
         
int main(int argc, char *argv[])
{
  LIST* L = NULL;
  uint input_ip;
  char str[MAX_LEN];
  init_list(&L);
  
  FILE* fp = fopen("IP.TXT","r");
  process_file( fp, L);
  print_list(L);
  printf("Please input the ip you want to judge:\n");
  fgets( str, MAX_LEN, stdin);
  input_ip = inet_addr(str);
  judge( input_ip, L)?printf("ok\n"):printf("sorry\n");
  system("PAUSE");    
  return 0;
}

 

代码有点问题,关键是inet_addr这个函数好像结果有点问题....不过应该不会继续考这种题了,抱抱侥幸的心理吧...谁要是弄清楚别忘了告知在下

今天去帮学姐买了个笔记本,还不错^_^.自己又去检查了下乙肝,呵呵,意料中的该阴的阴,该阳的阳.觉得医生这句话比较经典

今天晚上比较悠闲,茜茜小徒弟,一直想把这题完善好,我就满足下她的愿望吧...其实说到底就是个网络字节序的问题...

 inet_addr转换后是网络字节序,我们这里要使用的是主机字节序,要用ntohl转换下,还有刚debug的时候发现我的judge也有点问题,当时没考虑周到,最终代码修改如下

 

#include <stdio.h>
#include <stdlib.h>
#include <winsock.h>

#define MAX_LEN 50

typedef unsigned int uint;

typedef struct list
{
  uint ip_begin;
  uint ip_end;
  struct list* next;
}LIST;

void init_list(LIST** L)
{
  *L = (LIST*)malloc(sizeof(LIST));
  (*L)->ip_begin = 0;
  (*L)->ip_end = 0;
  (*L)->next = NULL;
}

int find_space(char* buf)
{
  int count = 0;
  while(*buf)
   {
     if(*buf == ' ')
      {
        return count;
      }
     count++;
     buf++;
   }
   return 0;
}

int process_file(FILE* fp,LIST* L)
{
  char buf[MAX_LEN];
  int space_locate = 0;
  int len;
  while(1)
  {
    if(fgets( buf, MAX_LEN, fp)!=NULL)
      {
        space_locate = find_space(buf);
        len = strlen(buf);
        buf[len-1] = '\0';
        LIST* p = L;
           
        if(space_locate == 0)
         {
           LIST* node = (LIST*)malloc(sizeof(LIST));
           printf("str is %s\n",buf);
           node->ip_begin = ntohl(inet_addr(buf));
           node->ip_end = node->ip_begin;
           while( p->next&& p->next->ip_begin<node->ip_begin)
               p = p->next;
               
           node->next = p->next;
           p->next = node;
          }
        else
         {
          LIST* node = (LIST*)malloc(sizeof(LIST));
          printf("str is %s\n",buf);
          buf[space_locate] = '\0';
          node->ip_begin = ntohl(inet_addr(buf));
          node->ip_end = ntohl(inet_addr(buf+space_locate+1));
          
         while( p->next&& p->next->ip_begin<node->ip_begin)
               p = p->next;
          node->next = p->next;
          p->next = node;
         }
      }
    else
      break;
  }
}

void print_list(LIST* L)
{
  LIST* p = L->next;
  while(p!=NULL)
   {
     printf("start:%u\tend:%u\n", p->ip_begin, p->ip_end);
     p = p->next;
   }
}

int judge(uint input_ip, LIST* L)
{
  LIST* p = L->next;
  while(p!=NULL)
   {
     if(p->ip_begin <= input_ip)
      {
        if(p->ip_end >= input_ip)
          return 1;
      }
      p = p->next;
    }
   return 0;
}
         
int main(int argc, char *argv[])
{
  LIST* L = NULL;
  uint input_ip;
  char str[MAX_LEN];
  init_list(&L);
  
  FILE* fp = fopen("IP.TXT","r");
  process_file( fp, L);
  print_list(L);
  while(1)
  {
   printf("Please input the ip you want to judge:\n");
   fgets( str, MAX_LEN, stdin);
   input_ip = ntohl(inet_addr(str));
   printf("your input is %u", input_ip);
   judge( input_ip, L)?printf("ok\n"):printf("sorry\n");
  }
  system("PAUSE");    
  return 0;
}

阅读(1301) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~