# 加载udp库函数udp_server = cdll.LoadLibrary("./udp_server.so")init_udp_server = udp_server.init_udp_serverdestroy_udp_server = udp_server.destroy_udp_serverupdate_udp_server = udp_server.update_udp_serverSendMsg = udp_server.SendMsgSetConnectCallback = udp_server.SetConnectCallbackSetDisconnectCallback = udp_server.SetDisconnectCallbackSetTimeoutCallback = udp_server.SetTimeoutCallbackSetRecvCallback = udp_server.SetRecvCallback2. 数据类型映射除了ctypes定义的基本数据类型(c_char, c_int, c_double等),还能使用pointer函数转换成指针类型。对于要导出的网络库,设置回调函数是必不可少的,在C++库里面,回调函数是通过设置一个函数指针完成的,ctypes同样支持函数指针的声明。如:recv_cb = CFUNCTYPE( None, c_char_p, c_int ),表示一个返回值为void,参数为char*和int类型的回调函数。def __init__(self, port, ip="127.0.0.1"): self._port = port self._ip = ip self._clients = {} self.c_connect_cb = connect_cb(self.server_connect) self.c_disconnect_cb = disconnect_cb(self.server_disconnect) self.c_timeout_cb = timeout_cb(self.server_timeout) self.c_recv_cb = recv_cb(self.server_recv)def create(self): if self._port: if init_udp_server(self._ip, self._port) == 0: print "server listen %s:%d" % (self._ip, self._port) SetConnectCallback( self.c_connect_cb ) SetDisconnectCallback( self.c_disconnect_cb ) SetTimeoutCallback( self.c_timeout_cb ) SetRecvCallback( self.c_recv_cb ) return True print "[error] init_udp_server error", self._ip, self._port return False绑定回调参数需要注意的是,绑定的回调函数需要保存为成员变量(上面的写法),目的是避免python垃圾回收导致回调函数变成野指针。这算是一个小小的坑吧。基本上一个小小的库也就用到这些功能。
新闻热点
疑难解答