- 论坛徽章:
- 0
|
局域网电脑管理系统之一
信息数据库的架构
使用 postgresql8.1 建立信息数据库。
建立三张表:
ü 交换机分布表: net_top
ü 办公室与井道端口对应表: net_port
ü mac 地址表: net_mac_addr
![]()
建立的程序如下:
create table net_top(
switch_pos integer,
floor integer
);
create table net_port(
room integer,
port1 integer,
port2 integer
);
create table net_mac_addr(
room integer,
mac_addr varchar(30),
ip_addr varchar(30),
owner varchar(20)
);
建立视图 net_room_port ,将表 1 、 2 连接起来。
create view net_room_view as
select * from net_top t left outer join net_port p
on (p,room/100=t.floor);
![]()
给 3 张表添加约束,使之能正确得存储。
在 net_port 中,将 room 设为主键:
alter table net_port add constraint room_prim primary key (room);
在 net_mac_addr 中将 room 设为 net_port.room 的外键:
alter table net_mac_addr
add foreign key (room) references net_port;
在 net_mac_addr 中设置 mac_addr 和 ip_addr 的检查:
alter table net_mac_addr add constraint mac_check check
(mac_addr ~ ‘^(00) [0-9A-Z]{10 }$’);
alter table net_mac_addr add constraint ip_check
check (ip_addr ~ ‘[0-9]{3}(\.[0-9]){1,3}$’);
表建立以后,就要进行数据输入。
1 :输入表 1 的数据:
新建一个文本文键 e:\switch.txt ,在其中输入数据,如下:
2 1
2 2
2 3
6 4
6 5
6 6
8 7
8 8
8 9
8 10
12 11
12 12
12 13
12 14
12 15
保存后,将该文本内容拷贝至表 1 中。
copy net_top from ‘e:/switch.txt’;
![]()
2 :输入表 2 的内容
新建一个文本文键 e:\room.txt ,编写一个脚本用来输入房间号:
open(FILE,'>e:/switch.txt');
for($init=1; $init
for($temp=1; $temp
$sum=$init*100+$temp;
print FILE "$sum"."\n";
}
}
close FILE;
然后根据大楼井道分布图所示,将端口填入,以下是其中的一部分:
1011040
102 1160
103 1050
104 1030
105 1060
106 0 0
107 1070
108 0 0
109 1080
110 0 0
11 0 0
112 0 0
113 109110
114 0 0
115 0 0
201 2040
202 2010
总共 228 个数据。需要提醒的是,以上所有数据行中的数据都用制表符
分割。保存后,将该文本内容拷贝至表 1 中。
copy net_port from ‘e:/room.txt’;
![]()
3 :输入表 3 的内容
这是最艰巨的,需要一台电脑接着一台得打入 ipconfig –all ,然后在逐一输入。为了简化操作,写了一组采集程序。
服务器端的程序如下:
$in_buffer=undef;
$PF_INET=2;
$port=2345;
$local_addr=pack('SnC4x8',$PF_INET,$port,192,168,138,105);
$SOCK_DGRAM=2;
socket(UDP_SERVER,$PF_INET,$SOCK_DGRAM,getprotobyname('udp')) or die("$!");
bind(UDP_SERVER,$local_addr) or die("$!");
listen(UDP_SERVER,100);
print("waiting for connection...\n");
$count=0;
while(1){
print $count." connection..\n";
$count++;
if(recv(UDP_SERVER,$in_buffer,100,0)){
open(FILE,'>>e:/mac_addr.txt');
chomp($in_buffer);
print FILE $in_buffer."\n";
close FILE;
}
else{next;}
}
close(UDP_SERVER);
![]()
客户端的程序如下:
@stack=();
$mac_addr=undef;
$ip_addr=undef;
print(' 请输入您的办公室门牌号码: ');
$room_num=;
chomp($room_num);
print(' 请输入您的姓名拼音: ');
$name=;
chomp($name);
open(FOO,'-|',"ipconfig -all");
while(){
chomp();
if($_=~s/(.*)(00(\-[0-9A-Z]{2}){5})(.*)/$2/){
$mac_addr=join('',split(/-/,$_));
}
if($_=~/IP Address/){
$_=~s/(.*)([0-9]{3}(\.[0-9]{1,3}){3})(.*)/$2/;
$ip_addr=$_;
}
}
close FOO;
push(@stack, $room_num);
push(@stack, $mac_addr);
push(@stack, $ip_addr);
push(@stack, $name);
$out_buffer=join("\t",@stack);
print $out_buffer."\n";
$PF_INET=2;
$port=2345;
$remote_addr=pack('SnC4x8',$PF_INET,$port,192,168,138,105);
$SOCK_DGRAM=2;
socket(UDP_CLIENT,$PF_INET,$SOCK_DGRAM,getprotobyname('udp'));
send(UDP_CLIENT,$out_buffer,0,$remote_addr);
close(UDP_CLIENT);
exit;
![]()
采集的数据被记录到服务器中:
![]()
然后将数据导入数据库:
copy net_mac_addr from ‘e:/mac_addr.txt’;
![]()
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/6088/showart_727976.html |
|