From 65563bb1f6fcb4d3a6cae59d15ef0c555936904d Mon Sep 17 00:00:00 2001 From: Timmoc Date: Thu, 28 Nov 2024 10:31:05 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=B9=E4=BA=86=E4=B8=80=E4=B8=8B=20sender?= =?UTF-8?q?=5Fnet.py=20=E7=8E=B0=E5=9C=A8=E4=B8=8D=E4=BC=9A=E5=9C=A8Py1.12?= =?UTF-8?q?=E6=8A=A5=E9=94=99=E4=BA=86=EF=BC=8C=E8=80=8C=E4=B8=94=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E4=BA=86ipv6=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.py | 9 +++++- sender/sender_net.py | 71 +++++++++++++++++++++++++++----------------- 2 files changed, 52 insertions(+), 28 deletions(-) diff --git a/main.py b/main.py index ece2f7b..49f2e0e 100644 --- a/main.py +++ b/main.py @@ -1,5 +1,7 @@ import pyfiglet # 程序greet +from sender import sender_net + # 程序greet print(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>") greet = pyfiglet.figlet_format("File Secure Transfer", font="slant" , width=250) @@ -7,4 +9,9 @@ print(greet) print(" ") author = " <-Made By Li-Nuo-Cheng Tan-Jun-Wen Ren-Qing-Yu->" print(author) -print("<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<") \ No newline at end of file +print("<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<") + +if __name__ == '__main__': + port, client_host, client_port = sender_net.input_verify() + a = sender_net.sender_net(port, client_host, client_port) + a.run() \ No newline at end of file diff --git a/sender/sender_net.py b/sender/sender_net.py index 60a2af7..1836700 100644 --- a/sender/sender_net.py +++ b/sender/sender_net.py @@ -1,12 +1,11 @@ -import hashlib +import ipaddress import json -import selectors import socket import threading from time import sleep -from entity.Letter import Letter,json_to_obj -import select + import sender +from entity.Letter import Letter, json_to_obj from recv import recv @@ -26,16 +25,17 @@ from recv import recv # pass class sender_net(): - def __init__(self,port=8424,client_host='127.0.0.1',client_port=8424): + def __init__(self, port=8424, client_host='127.0.0.1', client_port=8424): self.client_host = client_host self.client_port = client_port self.letter = Letter() - self.port=port - self.server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - self.server.bind(('0.0.0.0', self.port)) + self.port = port + self.server = socket.socket(socket.AF_INET6, socket.SOCK_STREAM) + # 设置socket选项以允许IPv4映射到IPv6 + self.server.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_V6ONLY, 0) + self.server.bind(('::', self.port)) self.server.listen(10) - def recver_thread(self): while True: conn, addr = self.server.accept() @@ -66,7 +66,6 @@ class sender_net(): except ValueError: print("[x] Error, please enter a valid number.") - def send_data(self, conn, msg): conn.sendall(msg) @@ -90,25 +89,30 @@ class sender_net(): letter: Letter = json_to_obj(data) recv.handleLetter(letter) - def run(self): - threading.Thread(target=self.main).start() + a = threading.Thread(target=self.main) + a.start() + a.join() def main(self): while True: try: - client = socket.socket() # 定义协议类型,相当于生命socket类型,同时生成socket连接对象 - client.connect((self.client_host, self.client_port)) + client = socket.create_connection( + (self.client_host, self.client_port)) # 定义协议类型,相当于生命socket类型,同时生成socket连接对象 print(" [*] Connected...") print("[*] if you want to send data, enter 0, if you want to send file, enter 1.") sleep(1) break - except socket.error: + except socket.error as e: + print(e) print("[*] Waiting for ...") - #加入线程 - threading.Thread(target=self.recver_thread, ).start() - threading.Thread(target=self.send_thread, args=(client,)).start() - + # 加入线程 + a = threading.Thread(target=self.recver_thread, ) + b = threading.Thread(target=self.send_thread, args=(client,)) + a.start() + b.start() + a.join() + b.join() def input_verify(): @@ -121,22 +125,35 @@ def input_verify(): while True: addr = input("[*] Enter the address to connect to(127.0.0.1:8424): ") + # 检查输入是否包含冒号 if ':' in addr: - client_host, client_port = addr.split(":") - if client_host and client_port.isdigit(): - client_port = int(client_port) - if 0 <= client_port <= 65535: # 检查端口范围 - break # 输入有效,跳出循环 + try: + # 分割地址和端口 + client_host, client_port = addr.rsplit(':', 1) + # 验证端口是否为数字 + if client_port.isdigit(): + client_port = int(client_port) + # 检查端口范围 + if 0 <= client_port <= 65535: + # 尝试解析IP地址 + try: + # 使用ipaddress模块来检查地址的有效性 + ipaddress.ip_address(client_host) + break # 输入有效,跳出循环 + except ValueError: + print("Invalid IP address format.") + else: + print("Port must be between 0 and 65535.") else: - print("Port must be between 0 and 65535.") - else: + print("Port number is not a valid integer.") + except ValueError: print("Invalid address format. Please enter in the format 'host:port'.") else: print("Invalid address format. Please enter in the format 'host:port'.") return port, client_host, client_port -#test +# test if __name__ == '__main__': port, client_host, client_port = input_verify() a = sender_net(port, client_host, client_port)