Форум сайта python.su
Помаленьку изучаю питон. Буксую в 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),
]
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))
Офлайн
Использовать ctypes.cast - в чем проблема?
Типы совместимы только у вас “в голове”, ctypes об этом знать не может.
Офлайн
Андрей СветловНу это я и хочу узнать как.
Использовать ctypes.cast - в чем проблема?
Типы совместимы только у вас “в голове”, ctypes об этом знать не может.
Офлайн
То, что cast работает только с указателями (как, вероятно, и ваша гипотетическая функция) - вы не прочитали?
ctypes.cast(obj, type)
This function is similar to the cast operator in C. It returns a new instance of type which points to the same memory block as obj. type must be a pointer type, and obj must be an object that can be interpreted as a pointer.
Офлайн
вот так вроде не ругается
sptr = ctypes.pointer(saddr)
sa = ctypes.cast(sptr, ctypes.POINTER(lib.sockaddr))[0]
Офлайн