Python随机生成目的IP与端口时如何实现同IP对应相同端口
随机IP-端口固定映射实现方案
原有代码与问题
原有实现将IP生成、端口生成拆分为两个完全独立的流程,二者没有绑定关系,因此重复抽取到同一IP时,会匹配到独立生成的不同端口,不符合需求。
原随机IP生成函数
import numpy as np import random def destinationipv4(no_ips,no_ops): list2=[] for i in range(0,no_ips): netwrk_id = np.random.choice(range(100,255),replace=True) host_id = np.random.choice(range(100,255),replace=True) ip_address_gen = f'192.168.{netwrk_id}.{host_id}' list2.append(ip_address_gen) return list(np.random.choice(list2,size=no_ops, replace=True))
原随机端口生成函数
def dst_port(n): list4=[] for i in random.sample(range(0, 1200), n): list4.append(i) return list4
异常输出示例
Destination IP Port 192.168.158.102 458 192.168.158.102 8
调整后实现代码
核心思路:先生成去重的IP池,给每个唯一IP提前分配唯一随机端口建立绑定关系,后续随机抽取IP生成结果时,直接从映射关系中读取对应端口,保证同一IP永远对应同一端口。
import numpy as np import random def generate_ip_port_pairs(unique_ip_count, output_count): """ 生成指定数量的目的IP-端口对,同一IP固定绑定同一个端口 :param unique_ip_count: 不重复IP池的总大小 :param output_count: 最终输出的条目总数(允许IP重复) """ # 生成去重的IP池 ip_pool = set() while len(ip_pool) < unique_ip_count: network_id = np.random.choice(range(100,255), replace=True) host_id = np.random.choice(range(100,255), replace=True) ip = f'192.168.{network_id}.{host_id}' ip_pool.add(ip) ip_pool = list(ip_pool) # 为每个唯一IP分配不重复的随机端口,建立映射 port_list = random.sample(range(0, 1200), unique_ip_count) ip_port_map = dict(zip(ip_pool, port_list)) # 随机抽取指定数量的IP,匹配预绑定端口生成结果 selected_ips = list(np.random.choice(ip_pool, size=output_count, replace=True)) return [(ip, ip_port_map[ip]) for ip in selected_ips] # 调用示例 if __name__ == "__main__": result = generate_ip_port_pairs(unique_ip_count=50, output_count=100) print("Destination IP Port") for ip, port in result: print(f"{ip:<18} {port}")
关键逻辑说明
- 用
set结构存储生成的IP自动去重,保证IP池内每个IP唯一,避免同IP重复分配端口 - 用字典存储IP与端口的一一映射关系,只要IP相同,查询映射返回的端口永远固定
- 端口通过
random.sample生成,保证每个唯一IP分配到的端口不重复,符合常规网络场景的端口使用习惯 - 最终随机抽取IP生成结果时,无论同一IP被抽中多少次,都直接读取预绑定的端口,完全满足同IP同端口的要求
内容的提问来源于stack exchange,提问作者Gourish Pisal
相关产品推荐
相关产品推荐

