局域网电脑管理系统之一
信息数据库的架构
使用
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<=15; $init++){
for($temp=1; $temp<=15; $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=<STDIN>;
chomp($room_num);
print('
请输入您的姓名拼音:
');
$name=<STDIN>;
chomp($name);
open(FOO,'-|',"ipconfig -all");
while(<FOO>){
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’;