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) |