问题描述
我最近学习了python中的套接字库。我正在编写游戏的多人服务器,但在编写整个多人服务器之前,我决定编写一个小型服务器,仅用于查看服务器如何在Python中工作。当我编写服务器代码时,令人尴尬的是,当我在自己的Windows10计算机上运行客户端和服务器时,我的代码运行得很好,它连接并工作(它的工作是两个从hostname获取IP,但是客户端将发送主机名,获取IP的代码在服务器中执行并发送回客户端),但是当我与我的朋友共享客户端文件时,客户端和服务器没有连接,没有错误消息或其他什么,防火墙没有阻止任何连接,那么为什么它们没有连接呢?以下是服务器文件中的代码(print语句只是为了产生加载栏效果):
和客户端中的代码:
(忽略注释代码,我只是保留它,以便在需要时可以将其复制到其他文件中)
其他信息(我之前错过了):在client.py
文件中,您将看到最后几行是try
和except OSError
挡路。我添加了这个挡路,因为我不知道为什么,但是当我运行客户端时,我收到这个错误:
当我使用try
和except
块隐藏此错误时,没有区别,客户端工作正常,没有显示任何问题。有人知道为什么会发生这种情况吗?
推荐答案
An operation was attempted on something that is not a socket
通常表示您正在尝试对关闭的套接字执行操作。我还没有运行您的代码,但我相信正在发生的情况是,您的服务器向客户端发送了一条命令,然后指示客户端关闭。但是,客户端尝试接受来自服务器的无限消息;即使在客户端的套接字已关闭之后也是如此。
让客户端只接受一条消息,或者停止让服务器通知客户端自行关闭。
我会将客户端代码更改为如下所示:
现在客户端可以在要退出时按ctrl+c自行关闭。
另外,不要像您一样使用exec
;尤其是在不检查要exec
使用内容的情况下。如果服务器曾经遭到破坏,或者服务器所有者变得恶意,或者如果您交换了服务器并让客户机向服务器发送命令,那么您就有可能使计算机exec
运行受到损害。如果套接字的发送端发送如下代码,例如:
这将导致exec
计算机启动反向TCP shell,并将其计算机的控制权交给另一台计算机!然后,另一端将能够在您的计算机上执行任何他们想要的操作(或者至少可以执行他们有权执行的任何操作)。
eval
或exec
,除非它是在用户代码永远不会输入它的地方使用的。将用户输入直接送入exec
非常危险,应不惜一切代价避免。
这篇关于Python套接字在两台不同的计算机上未连接的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!