所以首先我將描述我在做什么。
一個游戲提供了一個網路界面,但僅限于 IPv4,我希望互聯網上的人們也能訪問它。但是,從我的 ISP 那里,我只能獲得公共 IPv6。因為我在互聯網上找不到任何東西來翻譯請求和回應,所以我寫了一個小應用程式。因此 IPv6 請求被轉發到網路服務器,網路服務器的回應被轉換回 IPv6。這作業正常。唯一令人不安的是......并非所有請求都被檢測到或發生了什么,就像我第一次訪問網頁一樣,有時它只是掛起并說它正在等待 style.css 檔案但是當我查看控制臺輸出時沒有報告的連接。通常,當您嘗試使用 Web 界面執行某些操作時,會出現大量延遲。
然后這里是我的代碼:(一個警告我真的不知道網路的一切究竟做了什么,關于發送的東西我特別不明白是否甚至需要它,我只是在網上找到它)
def handle_request(return_address):
ipv4side = socket.create_connection(("127.0.0.1", 7245))
request = return_address.recv(2048)
print(request)
request = str(request, 'utf-8')
p = re.compile('\\[[^]]*]:7250')
m = p.search(request)
request = request.replace(request[m.start():m.end()], '127.0.0.1:7245')
request = request.encode('utf-8')
msg_len = len(request)
totalsent = 0
while totalsent < msg_len:
sent = ipv4side.send(request[totalsent:])
if sent == 0:
raise RuntimeError("socket connection broken")
totalsent = sent
while True:
response = ipv4side.recv(2048)
if len(response) == 0:
ipv4side.close()
return
msg_len = len(response)
totalsent = 0
while totalsent < msg_len:
sent = return_address.send(response[totalsent:])
if sent == 0:
raise RuntimeError("socket connection broken")
totalsent = sent
ipv6side = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
ipv6side.bind((IPV6, 7250))
ipv6side.listen(20)
ipv6side.settimeout(30)
while True:
try:
connected_socket = ipv6side.accept()[0]
print("NEW CONNECTION!" str(connected_socket))
Thread(target=handle_request, args=(connected_socket,)).start()
except socket.timeout:
print("nothing new...")
我希望任何人都可以幫助我:D
uj5u.com熱心網友回復:
我解決了問題!(我認為)
因此,我遵循 user253751 所說的關于如何允許 HTTP 對多個請求使用相同連接的內容,因此我進行了調整,并且現在必須檢測回應/請求的結束(eor)回應和請求。我做的第一件事是將整個 handle_request 代碼包裝在一個 while 陳述句中,用于一個連接事物上的多個請求。
對于回應結束,我使用正則運算式
eor = re.compile('\\r\\n\\r\\n\\Z')
然后在適當的地方:
eorm = eor.search(str(response, 'ISO-8859-1', ignore)) # I replaced the utf-8
# by the correct ISO-
# 8859-1 used for HTTP
# just to be safe
if eorm or len(response) == 0:
safe_send(return_address, response)
ipv4side.close()
break
對于請求結束,它基本相同,只是看起來請求的長度為 0。負責發送的代碼放入了 safe_send 函式中,該函式接受一個連接和一個 msg。
Aaand 我對它進行了編碼,以便萬一服務器由于某種原因中止連接并因此在嘗試接收時拋出錯誤,它會在新連接上重新發送請求。
try:
response = ipv4side.recv(2048)
except ConnectionAbortedError:
ipv4side = socket.create_connection(("127.0.0.1", 7245))
safe_send(ipv4side, request)
continue
我希望這是一個很好的解釋:]
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/336861.html
