使用Python套接字时使用“[WinError 10054]”

2024-09-22 14:33:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经为这个问题挣扎了五天。我在python上编写了一个简单的代理服务器,它开始监听端口3000-3005(线程1)上的游戏客户端。当客户端连接到代理时,代理在端口3000-3005上与游戏服务器建立连接(取决于游戏客户端选择连接的端口)。基本上,这个代理所做的就是用十六进制打印出游戏客户端和服务器之间的数据包。 代码是:

import socket
import threading

game_conn = None
srvr_conn = None

def listen_game(port):
    global game_conn
    host = '0.0.0.0'
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.bind((host,port))
    s.listen(1)
    print("listening at port: " + str(port))
    
    conn, addr = s.accept()
    global game_conn
    game_conn = conn
    serv_conn2(port)
    print("connection has been established with: " + str(addr) + ",and connection port is: " + str(port))

    send2srvr(port)
def send2srvr(port):
    while True:
        if srvr_conn!=None:
            try:
                data = game_conn.recv(4096)
            except:
                print("could not receive from game")
            try:
                print("["+str(port)+"]"+" sending to server...:" + str(data.hex()))
            except Exception as e:
                print("["+str(port)+"]"+" sending to server...:" + str(e))
            if data:
                srvr_conn.sendall(data)
                #print("["+str(port)+"]"+" sending to server...:" + str(data.hex()))
            

def serv_conn(port):
    conn = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    conn.connect(('192.168.1.90', port))
    global srvr_conn
    srvr_conn = conn
    print("connected to server at port: " + str(port))
    while True:
        try:
            data = srvr_conn.recv(4096)
        except:
            print("could not receive from srvr")
        try:
            print("["+str(port)+"]"+" sending to game...:" + str(data.hex()))
        except Exception as e:
            print("["+str(port)+"]"+" sending to game...:" + str(e))        
        if data:
            game_conn.sendall(data)
            #print("["+str(port)+"]"+" sending to game...:" + str(data.hex()))
    
def serv_conn2(port):
    t2 = threading.Thread(target = serv_conn, name='thread'+str(i), args=[port])
    t2.start()


for i in range(3000,3005):
    t1 = threading.Thread(target = listen_game, name='thread'+str(i*i), args=[i])
    t1.start()

在我访问游戏中的某些地方之前,这个代理可以正常工作,然后由于某种原因,游戏客户端发送0000(十六进制),我得到“ConnectionResetError:[WinError 10054]一个现有连接被远程主机强制关闭”

我会感激任何人的帮助,因为今天我已经哭了。谢谢


Tags: togame游戏客户端代理dataportdef