我正在使用从客户端获取数据的python编写自己的服务器,并且我已经在线阅读客户端在发送到服务器时屏蔽其数据。我已经完成了整个握手的事情,但我还没找到能够解开数据包的代码。我发现了一个声称可以执行此操作的代码但它不适用于我。是否有预先制作的功能或包装?任何帮助将不胜感激。
下面是我的代码:
# -----------------LISTEN FOR INCOMING DATA FUNCTION----------------- #
def listening_for_msgs(conn):
while True:
try:
rcv_msg = conn.recv(1024) #conn is the connection to the client
rcv_msg_str = str(rcv_msg[:].decode("utf-8"))
rcv_msg_list = rcv_msg_str.split('\r\n')
if rcv_msg_list[0] == 'GET /echo HTTP/1.1':
HandshakeThread = startHandshakeThread(rcv_msg_str, conn)
HandshakeThread.start()
else:
print(unmask_data(rcv_msg))
except UnicodeDecodeError:
unmask_data(rcv_msg)
# -----------------UNMASKING CLIENTS PACKET FUNCTION----------------- #
def unmask_data(rcv_msg):
# as a simple server, we expect to receive:
# - all data at one go and one frame
# - one frame at a time
# - text protocol
# - no ping pong messages
data = bytearray(rcv_msg)
if len(data) < 6:
raise Exception("Error reading data")
# FIN bit must be set to indicate end of frame
assert(0x1 == (0xFF & data[0]) >> 7)
# data must be a text frame
# 0x8 (close connection) is handled with assertion failure
assert(0x1 == (0xF & data[0]))
# assert that data is masked
assert(0x1 == (0xFF & data[1]) >> 7)
datalen = (0x7F & data[1])
# print("received data len %d" %(datalen,))
str_data = ''
if datalen > 0:
mask_key = data[2:6]
masked_data = data[6:(6 + datalen)]
unmasked_data = [masked_data[i] ^ mask_key[i % 4] for i in range(len(masked_data))]
str_data = str(bytearray(unmasked_data))
return str_data
答案 0 :(得分:0)
我正在编写自己的服务器,使用python从客户端获取数据,我在线阅读客户端在发送到服务器时屏蔽其数据。
我建议您再次阅读并使用其他资源。您正在将您的代码构思与来自WebSocket连接的常规Web请求混合在一起。屏蔽仅与WebSocket连接相关。描述WebSockets掩码如何工作,如何从Web请求建立WebSocket连接以及为什么WebSockets与普通套接字等不同,这个问题过于宽泛。如果您想快速获得结果,请使用existing libraries。如果您想了解所有这些如何编写自己的代码,请阅读specification for WebSockets或研究现有库的源代码。