序列化ctype联合 [英] Serializing ctype union

查看:45
本文介绍了序列化ctype联合的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

是否有一种方法可以序列化ctype联合以便通过套接字发送它们?我正在尝试通过套接字将联合发送到网络服务器,但是我无法序列化数据,而是将其作为联合对象的实例发送.是否可以使用Python Struct()库执行此操作(我不认为它支持联合)?任何帮助深表感谢!

Is there a way to serialized ctype unions in order to send them over sockets? I’m trying to send a union over sockets to a network server but I am unable to serialize the data and it instead sends as an instance of the union object. Is it possible to use Python Struct() library to do this (I don’t believe it supports unions)? Any help is much appreciated!

推荐答案

如果在 ctypes.Structure ctypes.Union <上调用 bytes()/code>,您将获得可以通过套接字传输的基础字节字符串.收到后,将该字节字符串复制回原始对象.

If you call bytes() on your ctypes.Structure or ctypes.Union, you will get the underlying byte string that can be transmitted over a socket. On receipt, copy that byte string back into the original object.

这是一个独立的例子.套接字服务器作为线程启动,并将向客户端发送两个对象.然后,客户端接收该对象并对其进行解释:

Here's a self-contained example. The socket server is started as a thread and will send two objects to a client. The client then receives the object and interprets it:

import ctypes
import socket
import threading

# Used to indicate what type of field is in the Union.
U32 = 1
DBL = 2

class MyUnion(ctypes.Union):
    _fields_ = ('u32',ctypes.c_uint32),('dbl',ctypes.c_double)

class MyStruct(ctypes.Structure):
    _pack_ = 1  # define before _fields_ to have an affect.
    _fields_ = ('type',ctypes.c_int),('u',MyUnion)

def client():
    s = socket.socket()
    s.connect(('localhost',5000))

    # Wrap the socket in a file-like object so an exact amount of bytes can be read.
    r = s.makefile('rb')

    # Read two structures from the socket.
    ex1 = MyStruct.from_buffer_copy(r.read(ctypes.sizeof(MyStruct)))
    ex2 = MyStruct.from_buffer_copy(r.read(ctypes.sizeof(MyStruct)))
    s.close()

    # display the correct Union field by type.
    for ex in (ex1,ex2):
        if ex.type == U32:
            print(ex.u.u32)
        else:
            print(ex.u.dbl)

def server():
    s = socket.socket()
    s.bind(('',5000))
    s.listen(1)
    c,a = s.accept()

    # Prepare two structures
    ex1 = MyStruct()
    ex1.type = DBL
    ex1.u.dbl = 1.234
    ex2 = MyStruct()
    ex2.type = U32
    ex2.u.u32 = 1234

    # Send them as bytes
    c.sendall(bytes(ex1))
    c.sendall(bytes(ex2))

    c.close()
    s.close()

# spin off the server in a thread so the client can connect to it.
t = threading.Thread(target=server)
t.start()

client()

输出:

1.234
1234

这篇关于序列化ctype联合的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆