我的套接字总是连接到服务器,即使是离线服务器

问题描述:

我使用python创建一个简单的客户端和服务器。为了创建我的服务器,我做了端口转发。但是我有一个问题,即我无法解决问题,事实上无论服务器是在线还是离线。我的套接字给了我一个成功的信息。这个失败来自哪里?我的套接字总是连接到服务器,即使是离线服务器

这是我在客户端代码:

import socket 
from threading import Thread 

client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
try: 
    client_socket.connect(("89.139.105.181", 8350)) 
    print "Client connection success" 
except socket.error: 
    print "Client error" 


def send_to_server(): 
    msg = raw_input("Client:") 
    client_socket.send(msg) 


def recv_from_server(): 
    response_server = client_socket.recv(1024) 
    print response_server 


def main(): 
    while True: 
     send_thread = Thread(target=send_to_server,) 
     recv_thread = Thread(target=recv_from_server,) 

     send_thread.start() 
     recv_thread.start() 

     send_thread.join() 
     recv_thread.join() 

if __name__ == "__main__": 
    main() 
+0

我建议你验证你的目标IP地址。它根本不可能发生。 – Shasha99

+0

该ip是路由器的IP,我做端口转发以连接到他,但这也适用于服务器处于脱机状态 –

+0

好的,所以ip是中间节点,它在收到请求后将其转发到实际的目标。即使你的实际目标已经死亡,你也会获得成功消息。我对么 ? – Shasha99

当你使用套接字这反过来又转发您请求到目标节点在同一网络中,您的中间节点的连接连接到中间节点将即使您的目标节点关闭,也可以成功。

因此,由于您的客户端的client_socket.connect()将不会被通知有关从中间节点到目标节点的套接字连接是否成功,因为它已成功连接到中间节点,它将始终返回成功。

但是,一个简单的黑客来查明你是否实际连接到目标节点将检查你是否实际上在发送请求后的指定时间内收到预期的响应(假设对于每个请求由客户端,服务器将发送一些响应)。