计网课设-发送TCP数据包

一、效果展示

二、代码实现

import nmap
import socket
import tkinter as tk
from tkinter import messagebox,Listbox
from threading import Thread#获取自身IP,从而确定当前局域网范围
def get_ip_address():#创建了一个socket对象,socket.AF_INET表示使用IPv4地址族,socket.SOCK_DGRAM表示使用UDP#使用UDP是因为不需要真正发送数据,通过连接一个地址来促使系统分配一个端口s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)try:# 不需要真正发送数据,所以使用一个不存在的地址#这段代码目的让操作系统分配一个本地端口,并返回当前机器IPs.connect(('255.255.255.255', 1))ip = s.getsockname()[0]print(s.getsockname())#print(type(s.getsockname()))except Exception as e:print(e)finally:s.close()# 找到第三个'.'的位置dot_index = ip.rfind('.')# print(dot_index)# 替换第三个'.'及其后的内容new_ip = ip[:dot_index] + '.0/24'return new_ipdef scan_local_network(listbox):nm = nmap.PortScanner()try:# 执行主机发现扫描network = get_ip_address()nm.scan(hosts=network, arguments='-sn')#清空列表框listbox.delete(0,tk.END)# 打印扫描结果for host in nm.all_hosts():status = nm[host].state()if status == 'up':listbox.insert(tk.END,host)except nmap.PortScannerError as e:messagebox.showerror("扫描失败",f"An error occurred:{e}")# 发送TCP消息的函数
def send_message():ip = ip_entry.get()port = int(port_entry.get())message = message_entry.get()try:with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:sock.connect((ip, port))sock.sendall(message.encode())messagebox.showinfo("发送成功", "消息已发送到" + ip)except Exception as e:messagebox.showerror("发送失败", str(e))# 更新IP输入框的函数
def update_ip(ip):ip_entry.delete(0, tk.END)ip_entry.insert(0, ip)# 定义启动TCP服务器的函数
def start_server(port):global server_sockettry:server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)server_socket.bind(('0.0.0.0', port))  # 监听所有接口上的端口server_socket.listen(1)messagebox.showinfo("服务器启动", f"服务器正在监听端口 {port}")while True:client_socket, addr = server_socket.accept()with client_socket:while True:data = client_socket.recv(1024)if not data:breakmessage_text.insert(tk.END, f"从{addr}接收到消息: {data.decode()}\n")client_socket.close()except Exception as e:messagebox.showerror("接收消息失败", str(e))finally:if 'server_socket' in globals() and server_socket:server_socket.close()# 在GUI中启动服务器的按钮
def start_server_button_clicked():port = int(port_entry.get())  # 获取用户输入的端口server_thread = Thread(target=start_server, args=(port,))server_thread.start()  # 启动线程# 初始化GUI界面
root = tk.Tk()
root.title("TCP消息发送器")# 使用grid布局管理器
root.columnconfigure(0, weight=1)
root.columnconfigure(1, weight=2)# IP输入框
ip_label = tk.Label(root, text="IP:")
ip_label.grid(row=0, column=0, padx=10, pady=5, sticky='e')
ip_entry = tk.Entry(root, width=20)
ip_entry.grid(row=0, column=1, padx=10, pady=5)# 端口输入框
port_label = tk.Label(root, text="PORT:")
port_label.grid(row=1, column=0, padx=10, pady=5, sticky='e')
port_entry = tk.Entry(root, width=20)
port_entry.grid(row=1, column=1, padx=10, pady=5)# 消息输入框
message_label = tk.Label(root, text="Message:")
message_label.grid(row=2, column=0, padx=10, pady=5, sticky='e')
message_entry = tk.Entry(root, width=50)
message_entry.grid(row=2, column=1, padx=10, pady=5)# 扫描按钮
scan_button = tk.Button(root, text="扫描局域网", command=lambda: scan_local_network(results_listbox))
scan_button.grid(row=3, column=0, padx=10, pady=5, sticky='w')# 发送按钮
send_button = tk.Button(root, text="发送", command=send_message)
send_button.grid(row=3, column=1, padx=10, pady=5, sticky='w')# 启动服务器按钮
start_server_button = tk.Button(root, text="启动服务器", command=start_server_button_clicked)
start_server_button.grid(row=4, column=1, padx=10, pady=5, sticky='w')# 显示扫描结果的列表框
results_listbox = tk.Listbox(root, width=35, height=10)
results_listbox.grid(row=5, column=0, columnspan=2, padx=10, pady=5, sticky='nsew')# 消息显示区域
message_text = tk.Text(root, width=50, height=10, wrap='word')
message_text.grid(row=6, column=0, columnspan=2, padx=10, pady=5, sticky='nsew')# 监听端口标签和输入框(放置在Frame中以避免布局冲突)
frame = tk.Frame(root)
frame.grid(row=7, column=0, columnspan=2, padx=10, pady=5, sticky='ew')listen_port_label = tk.Label(frame, text="Listening Port:")
listen_port_label.pack(side=tk.LEFT, padx=10, pady=5)
listen_port_entry = tk.Entry(frame, width=20)
listen_port_entry.pack(side=tk.LEFT, padx=10, pady=5)# 为扫描结果列表框添加选择事件
#event参数是tkinter事件对象,包含了事件相关信息
def on_select(event):#通过事件对象的widget属性获取触发事件的组件,即被点击的列表框w = event.widget#调用列表框w的curselection()方法,获取当前被选中的项目索引列表,如果没有项目被选中,则返回空列表selection = w.curselection()if selection:#事实上curselection返回的只有一个值index = selection[0]#获取IPip = w.get(index)#更新IPupdate_ip(ip)#将on_select函数绑定到results_listbox列表框的<<ListboxSelect>>事件上,意味着每当列表框中的项目被选中时,
#就会触发on_select函数
results_listbox.bind('<<ListboxSelect>>', on_select)# 启动GUI主循环
root.mainloop()

三、注意事项

<1>想要实现扫描局域网功能,主机必须安装有nmap

<2>在发送消息前,接收端需要监听对应端口如上述展示中的1234,之后发送端可以向接收端监听的端口发送信息

<3>在手机热点构成的局域网下,某些电脑将无法实现发送信息功能,即使对方已经监听对应端口(至少我的电脑就不可以)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/31003.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

扩散模型详细推导过程——训练与采样

扩散模型的训练与采样算法 训练目标的推导 需要使得去噪过程所产生的 x ( i ) \boldsymbol{x}^{(i)} x(i)的总体出现概率最大&#xff0c;先不考虑第几个样本&#xff0c;省略上标&#xff0c;即最大化 p ( x ∣ θ 1 : T ) p(\boldsymbol{x}|\theta_{1:T}) p(x∣θ1:T​)&am…

【Java】计算程序耗时多少

使用hutool自带的工具类实现 import cn.hutool.core.date.StopWatch; Slf4j public class TestApp {Testpublic void test1() {StopWatch stopWatch new StopWatch();try {// 开始计时stopWatch.start("handleReq");// 执行要测量的代码块performTask();// 停止计时…

国际版多商户商城小程序源码(Android+IOS+H5)

一站式全球购物新体验 功能介绍 精准分类、我的团队、开通会员我的返利、我的订单、快速购买 邀请返利、购物车、我的提现 一、引言&#xff1a;为何选择国际版多商户商城小程序&#xff1f; 随着全球化的步伐不断加快&#xff0c;越来越多的人开始追求国际化的购物体验。国…

FreeBSD在zfs挂接第二块ssd 硬盘

为FreeBSD机器新增加了一块ssd硬盘&#xff1a;骑尘 256G 先格式化分区硬盘 进入bsdconfig 选Disk Management 选择ada1 &#xff0c;也就是新增加的硬盘 选择auto 然后选择Entire Disk 提示信息 The existing partition scheme on this disk (MBR) │ …

密码学与信息安全面试题及参考答案(2万字长文)

目录 什么是密码学?它的主要目标是什么? 请解释明文、密文、加密和解密的概念。 密码系统的安全性通常基于哪三种假设? 什么是Kerckhoffs原则?它对现代密码学设计有何意义? 简述密码学中的“混淆”和“扩散”概念。 什么是AES(高级加密标准)?AES有几种常见的密钥…

代码随想录训练营Day 64|卡码网98. 所有可达路径(深搜)

1.所有可达路径 98. 所有可达路径 | 代码随想录 代码&#xff1a; &#xff08;深搜&#xff09;邻接矩阵表示 #include <iostream> #include <vector> using namespace std; vector<int> path; vector<vector<int>> result; void dfs(const ve…

图论算法学习

图论 dfs是可一个方向去搜&#xff0c;不到黄河不回头&#xff0c;直到遇到绝境了&#xff0c;搜不下去了&#xff0c;再换方向&#xff08;换方向的过程就涉及到了回溯&#xff09;。bfs是先把本节点所连接的所有节点遍历一遍&#xff0c;走到下一个节点的时候&#xff0c;再…

01_RISC-V 入门及指令集学习

参考文档 risc-v入门&#xff1a;https://blog.csdn.net/bebebug/article/details/128039038RISC-V OS&#xff1a;https://blog.csdn.net/bebebug/article/details/130551378riscv-spec文档&#xff1a;https://riscv.org/wp-content/uploads/2019/12/riscv-spec-20191213.pd…

小摩法兴纷纷转多,看涨港股的时机来了吗?

恒生指数今日高开一度上涨89点报18520点&#xff0c;创近两周高。之后持续震荡下行&#xff1b;恒指临近中 午跌幅扩大&#xff0c;恒生科技指数一度跌近1.5%。截止收盘&#xff0c;恒生指数跌0.52%&#xff0c;盘面上&#xff0c;石油、煤炭、环保、建筑节能等板块涨幅居前&a…

java中的Random

Random 是 Java 中的一个内置类&#xff0c;它位于 java.util 包中&#xff0c;主要用于生成伪随机数。伪随机数是指通过一定算法生成的、看似随机的数&#xff0c;但实际上这些数是由确定的算法生成的&#xff0c;因此不是真正的随机数。然而&#xff0c;由于这些数在统计上具…

新手下白对Latex下手啦!

第一次使用latex&#xff0c;浅浅地记录一下子吧。 首先我们一般会下载一个latex模板&#xff0c;如果想知道咋下载&#xff0c;评论去告诉俺哟&#xff01; 新手小白首先要看懂结构&#xff0c;不然完全下不了手&#xff0c;本文就以IEEE的模板&#xff0c;从头往下讲咯~ 第…

网页的CSS和JavaScript文件没有自动更新, 解决办法

项目场景&#xff1a; 无人值守的场馆预定以及管理 问题描述 更新了CSS和JavaScript&#xff0c;访问始终样式不对 原因分析&#xff1a; 浏览器缓存了你的CSS和JavaScript文件 浏览器缓存了你的CSS和JavaScript文件。当文件的修改时间戳&#xff08;last-modified&#xff…

QT处理Unix信号

从Unix信号处理程序中调用Qt函数 你不能从Unix信号处理程序中调用Qt函数。适用于标准POSIX规则:只能从信号处理程序调用异步信号安全的函数。有关可以从Unix信号处理程序调用的函数的完整列表&#xff0c;请参阅Signal Actions。 但不要绝望&#xff0c;有一种方法可以在Qt中使…

力扣503.下一个更大元素II

力扣503.下一个更大元素II 循环数组实现&#xff1a;断环成链 开二倍数组做单调栈 class Solution {public:vector<int> nextGreaterElements(vector<int>& nums) {int n nums.size();vector<int> res(n);stack<int> st;for(int i 2*n-1;i>…

OpenAI 推出“模型规范”:塑造责任制的人工智能的框架

为了提升人工智能开发的责任性和透明度&#xff0c;OpenAI 最近发布了一份名为“模型规范”的初步草案。这份文件首次明确了其 API 和 ChatGPT 模型行为的指导原则&#xff0c;并通过博客形式对外公布。 OpenAI 在博客中解释说&#xff1a;“我们之所以发布此文档&#xff0c;…

云渲染全攻略:平台精挑细选与技巧指南

在数字化浪潮中&#xff0c;创意产业的每一步进步都得益于技术革新。云渲染技术以其卓越的效率和灵活性&#xff0c;已成为推动影视、建筑、游戏等创意行业快速发展的关键力量。本文将为您提供一份详尽的云渲染指导手册&#xff0c;涵盖平台挑选策略和操作技巧&#xff0c;助您…

Centos7.9安装kerberos

文章目录 一、背景二、Kerberos安装部署2.1kerberos服务端必要软件安装2.2配置krb5.conf2.3配置kdc.conf2.4配置kadm5.acl2.5创建Kerberos数据库2.6启动Kerberos服务2.7创建Kerberos管理员principal2.8客户端安装kerberos2.9Kerberos功能验证 本人其他相关文章链接 一、背景 亲…

Redis 数据恢复及持久化策略分析

在分布式系统中&#xff0c;Redis作为高性能的键值存储数据库&#xff0c;广泛应用于缓存、会话管理、消息队列等场景。对于Redis数据的可靠性&#xff0c;持久化是至关重要的一环。当Redis宕机时&#xff0c;如何恢复数据成为一个关键问题。这篇文章将详细分析Redis的数据恢复…

科普文章:怎么远程监控电脑屏幕?三种监控电脑屏幕的方法

远程监控公司电脑屏幕是一项重要的管理手段&#xff0c;它不仅有助于提升工作效率&#xff0c;还能确保公司信息安全和合规性。随着远程办公的普及&#xff0c;这一需求变得日益重要。下面我将详细介绍几种实现远程监控公司电脑屏幕的方法&#xff0c;以及实施过程中需要注意的…

线程池的简介

定义 线程池就是使用多线程的方式&#xff0c;将任务添加到队列中任务都是runnable或者callable的实现类 优点 线程和任务分离&#xff0c;任务可以复用线程池统一管理线程&#xff0c;线程可以复用避免因为开启和销毁线程造成的资源浪费 官方线程池的参数分析 深度理解 线程池…