Найти - Пользователи
Полная версия: Структуры в Ctypes
Начало » Python для новичков » Структуры в Ctypes
1
TheMixa
Помаленьку изучаю питон. Буксую в 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?
Андрей Светлов
Использовать ctypes.cast - в чем проблема?
Типы совместимы только у вас “в голове”, ctypes об этом знать не может.
TheMixa
Андрей Светлов
Использовать ctypes.cast - в чем проблема?
Типы совместимы только у вас “в голове”, ctypes об этом знать не может.
Ну это я и хочу узнать как.
sa=ctypes.cast(saddr, lib.sockaddr)
Ругается:
ctypes.ArgumentError: argument 1: <type ‘exceptions.TypeError’>: wrong type
Андрей Светлов
То, что 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.
TheMixa
вот так вроде не ругается
    sptr = ctypes.pointer(saddr)
sa = ctypes.cast(sptr, ctypes.POINTER(lib.sockaddr))[0]
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB