说明:
所有设备开机后,IP地址均会被平台以SNMP的方式发现并记录入库。
环境没有DHCP,用户自己配置IP地址上网,需要检测下哪些IP地址没有人使用。
问题的一个难点在于,这个IP已经分配给了别人,但是这个人刚好没有开机,那么怎么判断这个IP是否已经有人用了呢。
恰好平台会有相对所有设备的IP,故基于查询数据库IP信息,进行对比。
另一个难点是用户的电脑可能是单个网卡或IP,也可能是多个网卡或多个IP,其实严格来讲或许并不很严谨。
思路:1.获取本地电脑的名子,所有的IP地址。
2.将本地的IP地址和电脑名组成字典。
 3.从数据库获取每个IP相同网段的IP地址,这里现场刚好使用的C段比较好实现。
   4.用本地的每个IP的前3位生成254个IP地址,然后把查询出来已经使用的这个段的IP地址排除掉,剩下的展示给用户,让他从中选一个自己用。
   5.如果用户的IP地址在数据库中查询不到,那么就只显示下本地电脑名子和所有的IPv4的地址。
嗯嗯,就这样子先。不在现场远程模拟现场环境;
参考和复制了部分网络的代码,如果您希望我删掉,请告诉我。不想重复造轮子,我不会,也不想。
代码如下:
我得把数据库的名子注释掉,用的python+postgresql+ psycopg2
ps:这个网站的编辑格式,我没整习惯,也暂时不想整习惯,格式如果变化了,请理解。

import psycopg2
import socket
import random
import sys


def get_local_ip_list():

local_ip_lists = []#获取电脑本地所有IPv4地址
#========================================================
# 查看当前主机名
print('当前主机名称为 : ' + socket.gethostname())
c_hostname = socket.gethostname()
# 下方代码为获取当前主机IPV4 和IPV6的所有IP地址(所有系统均通用)
addrs = socket.getaddrinfo(socket.gethostname(),None)
print('当前主机所有的IPv4地址:' )
for ipinfo in addrs:
    if ':' not in ipinfo[4][0]:
        print(ipinfo[4][0])
        local_ip_lists.append(ipinfo[4][0])
return local_ip_lists检查到服务器的网络通不通
def try_connect_server(cip,ip, port):

#server port and ip

server_ip = ip

servr_port = port

tcp_client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

l_port = random.randint(65000, 65530)

try:

#如果可以连接到服务器,那么我就去检查这个IP是否已经被使用

tcp_client.bind((cip,l_port))

tcp_client.connect((server_ip, servr_port))

tcp_client.shutdown(2)

return True

except :

#如果连建不到服务器,那么我们不做什么

return Falsedef get_data(database_info,sql):

conn = psycopg2.connect(database=database_info["database"],

user=database_info["user"],

password=database_info["password"],

host=database_info["host"],

port=database_info["port"])

cur = conn.cursor()

try:

cur.execute(sql)

#获取表的所有字段名称

coloumns = [row[0] for row in cur.description]

result = [[str(item) for item in row] for row in cur.fetchall()]

return [dict(zip(coloumns, row)) for row in result]

except Exception as ex:

print(ex)

finally:

conn.close()数据库连接信息
def format_data():

return_ip_list = []

all_used_ip = []

sql="select strdevip,strdevname from tbl_devbaseinfo"

data=get_data(database_info,sql)

return data

# for item in data:

#     return_ip_list.append(item)# for ipp in return_ip_list:
#     ippused =ipp['strdevip']
#     print(ippused)
#     all_used_ip.append(ippused)
#     return all_used_ipdef ganarater_local_ips(ipaddr):

top3 = ipaddr.split('.')

c_ips = []

for lastipnum in range(1,255):

sip = top3[0] + '.' + top3[1] + '.' + top3[2] + '.' + str(lastipnum)

c_ips.append(sip)

# return_ip_list = []

all_used_ip = []

sql="select strdevip from tbl_devbaseinfo where strdevip like '" + top3[0] + '.' + top3[1] + '.' + top3[2] + ".%'"

data=get_data(database_info,sql)

for temp_used_ip in data:

all_used_ip.append(temp_used_ip['strdevip'])

not_used_ips = []

for temp_ip in c_ips:

if temp_ip not in all_used_ip:

not_used_ips.append(temp_ip)

return not_used_ipsif name == 'main':

"""

整体思路:

1.先获取电脑所有的IPv4地址

2.测试到服务器的连通性,如果到服务器的链路是通的,则下一步和已分配的IP地址做对比,如果到服务器不通,则不做处理

3.如果IP地址存在数据库中,则提示IP地址已经被使用,然后查询同网段已经使用的IP地址,将可使用的IP地址打印显示出来

4.如果IP地址不在数据库中,则不做任何提示,

"""

database_info={

"database":"数据库名子",

"user":"用户名",

"password":"数据库密码",

"host":"192.168.136.128",

"port":"5432"

}

#server_ip = '192.168.30.112'

server_ip = 'www.baidu.com'

#获取到本地IPv4地址并显示

local_ips = get_local_ip_list() #本地IPv4地址

local_ips2 = []  #可以连接到服务器的IP地址

local_hostname = socket.gethostname()#测试每个IP地址到服务器的联通性
for ip in local_ips:
    if try_connect_server(ip,server_ip,80):
        local_ips2.append(ip)
        
if len(local_ips2) == 0 :
    print("您的本地IP均无法连接到服务器,请检查网络故障!")
    sys.exit()
#用可以连通服务器的每个IP地址去数据库中查询,是否已经有人使用
used_ip_lists = format_data() #获取数据库中所有的IP地址和电脑名称
#print(used_ip_lists)
local_machine_name = {}
local_used_ips = []
for ip in local_ips:
    local_machine_name['strdevip'] = ip
    local_machine_name['strdevname'] = socket.gethostname()
    #print(local_machine_name)
    # if local_machine_name in used_ip_lists and local_machine_name['strdevname'] != used_ip_lists['strdevname']:
    #     print("您当前使用的IP地址已经被这台电脑 " + used_ip_lists['strdevname'] + " 电脑使用,请更换下面未被使用的IP地址中的一个")
    for used_ip_info in used_ip_lists:
        if local_machine_name['strdevip'] == used_ip_info['strdevip'] and local_machine_name['strdevname'] != used_ip_info['strdevname']:
            local_used_ips.append(local_machine_name['strdevip'])
            print("您当前使用的IP地址" + local_machine_name['strdevip'] +"已经被这台电脑 " + used_ip_info['strdevname'] + " 电脑使用,请更换下面未被使用的IP地址中的一个")

        if local_machine_name['strdevip'] == used_ip_info['strdevip'] and local_machine_name['strdevname'] != used_ip_info['strdevname']:
            #此处用当前的可以连接到服务器的IP地址,生成整个c段的地址,然后把数据库里符合这个c段的地址全部排除掉
            for local_ip_used in local_used_ips:
                local_c_ips = ganarater_local_ips(local_machine_name['strdevip'])
                print(local_c_ips)