【发布时间】:2021-07-16 21:49:03
【问题描述】:
我知道已经有很多关于这个问题的主题,但我仍然找不到任何好的答案,所以我在这里。
我正在使用 Python3 在主机和服务器之间进行通信。两台本地机器之间一切正常,我决定将服务器端放在 VPS 上。从那时起,我每次尝试连接时都会收到此错误:
ConnectionRefusedError: [Winerror 10061] No connection could be made because the target machine actively refused it
我禁用了 vps 防火墙,更改了端口、连接目标和所有内容。我试图 nmap 端口,我得到了这个结果:
这是我的客户端代码:
import socket
HEADER = 64
PORT = 40000
FORMAT = 'utf-8'
DECONNEXION = "!DECONNEXION"
SERVER = "vps-xxxxxxxx.vps.ovh.net"
ADDR = (SERVER, PORT)
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(ADDR)
def envoyer(msg):
message = msg.encode(FORMAT)
message_longueur = str(len(message)).encode(FORMAT)
message_longueur += b' '*(HEADER-len(message_longueur))
client.send(message_longueur)
client.send(message)
print(client.recv(2048).decode(FORMAT))
def communication():
while (True):
envoyer(input())
communication()
服务器:
#!/usr/bin/python3
import socket
import threading
HEADER = 64
PORT = 40000
SERVEUR = socket.getfqdn(socket.gethostname())
ADDR = (SERVEUR, PORT)
FORMAT = 'utf-8'
DECONNEXION = "!DECONNEXION"
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(ADDR)
def handle_client(conn, addr):
print("[NOUVELLE CONNEXION] :", addr)
message=""
connecte = True
while connecte:
longueur_message = conn.recv(HEADER).decode(FORMAT)
if(longueur_message):
longueur_message = int (longueur_message)
message = conn.recv(longueur_message).decode(FORMAT)
print("[", addr, "] : ", message)
conn.send("Message reçu !".encode(FORMAT))
if "!DECONNEXION" in message:
connecte = False
conn.close()
def start():
server.listen()
print("[STATUT] Serveur démarré sur", SERVEUR,":", PORT )
while True:
conn, addr = server.accept()
thread = threading.Thread(target=handle_client, args=(conn, addr))
thread.start()
print("[CONNEXIONS] ", threading.active_count() -1 )
print("[STATUT] Le serveur démarre... ")
start()
但正如我所说,这段代码在本地工作。是不是 OVH 有自己的时髦防火墙来阻止 tcp 端口 40000? 提前致谢
【问题讨论】:
-
“禁用 VPS 防火墙”是什么意思?你的意思是像
ufw disable这样的东西吗?你看过OVH控制台吗?我使用过的所有云提供商都有某种默认的入站流量块。 docs.ovh.com/ie/en/dedicated/firewall-network -
顺便说一句,您的通信协议实现(尽管它有一个长度标头——干得好!)并不完全正确,因为消息可能比单个
.recv()调用更长将收到。 -
(另外,您需要在发送端使用
.sendall()...) -
ufw disable是我所做的并且没有改变任何东西。我已经看过这个文档页面,但正如那里所说,默认情况下没有启用防火墙... -
好吧,那么显而易见的另一个想法是尝试任何其他端口,以防万一你的 40000 不走运:)
标签: python python-3.x sockets vps ovh