Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 24, 2010 09:22:22

TheMixa
От:
Зарегистрирован: 2010-10-23
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Структуры в Ctypes

Помаленьку изучаю питон. Буксую в 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?



Офлайн

#2 Дек. 24, 2010 09:45:42

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Структуры в Ctypes

Использовать ctypes.cast - в чем проблема?
Типы совместимы только у вас “в голове”, ctypes об этом знать не может.



Офлайн

#3 Дек. 24, 2010 10:28:45

TheMixa
От:
Зарегистрирован: 2010-10-23
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Структуры в Ctypes

Андрей Светлов
Использовать ctypes.cast - в чем проблема?
Типы совместимы только у вас “в голове”, ctypes об этом знать не может.
Ну это я и хочу узнать как.
sa=ctypes.cast(saddr, lib.sockaddr)
Ругается:
ctypes.ArgumentError: argument 1: <type ‘exceptions.TypeError’>: wrong type



Офлайн

#4 Дек. 24, 2010 10:48:16

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Структуры в 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.



Офлайн

#5 Дек. 24, 2010 10:48:17

TheMixa
От:
Зарегистрирован: 2010-10-23
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Структуры в Ctypes

вот так вроде не ругается

    sptr = ctypes.pointer(saddr)
sa = ctypes.cast(sptr, ctypes.POINTER(lib.sockaddr))[0]



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version