Помаленьку изучаю питон. Буксую в Ctypes.
class in_addr(Structure):
pass
uint32_t = c_uint32
in_addr_t = uint32_t
in_addr._fields_ = [
('s_addr', in_addr_t),
]
class sockaddr(Structure):
pass
sockaddr._fields_ = [
('sa_family', sa_family_t),
('sa_data', c_char * 14),
]
class sockaddr_in(Structure):
pass
sockaddr_in._fields_ = [
('sin_family', sa_family_t),
('sin_port', in_port_t),
('sin_addr', in_addr),
('sin_zero', c_ubyte * 8),
]
Нужно заполнить sockaddr_in и передать в C-функцию как sockaddr:
saddr = libname.sockaddr_in()
saddr.sin_family = socket.AF_INET
saddr.sin_addr.s_addr = socket.htonl(0x7f000001)
saddr.sin_port = socket.htons(3000)
result = CFunction(saddr, sys.getsizeof(saddr))
Но происходит руганть вида expected LP_sockaddr instance instead of LP_sockaddr_in. Вроде эти два типа совместимы, как сделать cast?