【发布时间】:2021-01-06 21:58:36
【问题描述】:
(Windows 10、x64、PyCharm)
短篇小说:我在 python 服务器脚本中遇到了 payload_in.event 和 payload_out.event 的问题。两者都来自c_wchar_p 类型,后者来自ctypes。
长篇大论:
我目前正在使用 python 开发客户端和服务器。它们通过 127.0.01:6666 上的 TCP/IP 套接字进行通信。我正在使用模块 Ctypes 来发送和接收类似 c 的结构。一切正常,我可以发送/接收数组、整数、浮点数并在两侧使用它们,但我发现在 python 服务器脚本中打印 payload_in.event 和 payload_out.event 时存在错误,两者都是 @987654327 类型@。
在客户端脚本中,我可以完美地访问和打印payload_in.event 和payload_out.event ***但是即使代码相同,我的服务器脚本也不能。 . .
在服务器脚本中,打印 payload_in.event 和 payload_out.event 会导致两个程序暂停 10 秒左右,然后客户端控制台告诉我与服务器的连接已关闭。
如果我在 python 服务器脚本中注释掉 payload_in.event 和 payload_out.event 的打印,一切正常。我不知道如何解决此问题,如果有人可以帮助我,我会很高兴。
beagleServer.py
import socket
from ctypes import *
class Struct(Structure):
_fields_ = [("id", c_uint32), # 4B
("prio", c_uint32), # 4B
("event", c_wchar_p), # 8B
("data", c_float * 10)] # 40B
def main():
BUFFSIZE = sizeof(Struct)
host = '127.0.0.1'
port = 6666
beagleServer = socket.socket()
beagleServer.bind((host, port))
beagleServer.listen(1)
print("Server is listening on " + host + ":" + str(port) + "!")
client, clientAddress = beagleServer.accept()
print("Connection from: " + str(clientAddress[0]) + ":" + str(clientAddress[1]))
# receiving payload
buffer = client.recv(BUFFSIZE)
payload_in = Struct.from_buffer_copy(buffer)
print("\nPayload of ", sizeof(payload_in), " Bytes has been received successfully: ", payload_in,
"\nPayload.id: ", payload_in.id,
"\nPayload.prio: ", payload_in.prio,
"\nPayload.event: ", payload_in.event,
"\nPayload.data: ", list(payload_in.data),
"\nReceived buffer: ", buffer)
# sending back payload
payload_out = payload_in
transferredBytes = client.send(payload_out)
print("\nPayload of ", transferredBytes, " Bytes has been sent successfully: ", payload_out,
"\nPayload.id: ", payload_out.id,
"\nPayload.prio: ", payload_out.prio,
"\nPayload.event: ", payload_out.event,
"\nPayload.data: ", list(payload_out.data))
print("Closing server socket!")
client.close()
if __name__ == '__main__':
main()
beagleClient.py
import socket
from ctypes import *
class Struct(Structure):
_fields_ = [("id", c_uint32), # 4B
("prio", c_uint32), # 4B
("event", c_wchar_p), # 8B
("data", c_float * 10)] # 40B
beagleServer = ('127.0.0.1', 6666)
beagleClient = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
beagleClient.connect(beagleServer)
print("Connection with server has been established!")
# Creating the Struct
payload_out = Struct(390897,
0,
"activateMode1",
(3.12, 4.21, 1.23))
print("\nPayload of ", sizeof(payload_out), " Bytes has been created successfully: ", payload_out,
"\nPayload.id: ", payload_out.id,
"\nPayload.prio: ", payload_out.prio,
"\nPayload.event: ", payload_out.event,
"\nPayload.data: ", list(payload_out.data))
# Sending
bytesTransferred = beagleClient.send(payload_out)
print("\nPayload of ", bytesTransferred, " Bytes has been sent!")
# Receiving
BUFFSIZE = sizeof(Struct)
buffer = beagleClient.recv(BUFFSIZE)
payload_in = Struct.from_buffer_copy(buffer)
print("\nPayload of ", sizeof(payload_in), " Bytes has been received successfully: ", payload_in,
"\nPayload.id: ", payload_in.id,
"\nPayload.prio: ", payload_in.prio,
"\nPayload.event: ", payload_in.event,
"\nPayload.data: ", list(payload_in.data))
print("Closing the connection to ", beagleServer, "!")
beagleClient.close()
【问题讨论】:
-
c_wchar_p是 pointer 类型。通过网络传输这个 64 位值并不会神奇地授予接收者读取指向的数据的能力,这些数据位于发送进程的内存空间中的某个位置。您需要将实际字符放入结构中,而不是指向它们的指针。 -
正如 jasonharper 所说... python 有指针。您的代码阻塞,因为它试图读取提供的地址(甚至可能不存在于服务器内存空间中)。
-
谢谢大家,现在我明白了!
标签: python ctypes python-sockets