gpt4 book ai didi

python - 查找从客户端选择的端口的最佳方法

转载 作者:行者123 更新时间:2023-12-03 11:56:59 25 4
gpt4 key购买 nike

我的程序使用地址 ('0.0.0.0', 0) 随机选择一个端口服务器端和一个独特的 code发送到客户端,其中套接字试图连接到一个范围内的每个端口并检查相同的 code确认正确的服务器端口。

问题是遍历所有端口( range(1024, 65336) ),即使 ThreadPool 尝试连接到每个端口都非常慢用来。

这只是一个例子来展示我正在尝试做的事情。我的主程序通过互联网而不是本地主机托管。

服务器.py

import socket 

CODE = 'Code123' # just an example

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
addr = ('0.0.0.0', 0)
server.bind(addr)

# Can see which port is assigned
print(server)

def start():
server.listen(5) # connect to 5 connection.
while True:
conn, addr = server.accept()
conn.send(CODE.encode('utf-8'))
print("Code Sent")

start()

客户端.py

import socket
from multiprocessing.pool import ThreadPool

code = 'Code123' # just an example
server = socket.gethostbyname(socket.gethostname())
port_left = 65336
found = False

def connect(port):
global port_left, code, server, found
if found: return
port_left -= 1
try:
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect((server, port))
if client.recv(len(code)).decode('utf-8') == code:
found = True
return client
else: client.close()
except Exception as e:
print(e, port_left)
return None

pool = ThreadPool(10)
values = [('c', i) for i in set(pool.map(connect, range(1024, 65336))) if i]
client = dict(values).get('c')
pool.close()
pool.join()
print(client)

有没有更好的方法来实现这个目标或提高我现有代码的性能?

最佳答案

不是直接的答案,但评论太长了。

这不是期望使用随机端口的方式。它们以这种方式用于 FTP 协议(protocol)中的数据连接(被动模式):

  • 客户端在众所周知的端口 (21)
  • 上打开控制连接
  • 它通过控制连接
  • 向服务器请求一个随机数据端口
  • 它打开数据连接知道它的端口

  • 应避免在随机端口上打开连接,因为如果服务器没有立即响应,客户端必须等待超时来确定服务器是否正忙。

    因此,如果您想使用随机端口,我的建议是保留一个众所周知的端口,客户端将在该端口上获得真正的随机端口。

    关于python - 查找从客户端选择的端口的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62023097/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com