# 加載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垃圾回收導致回調函數變成野指針。這算是一個小小的坑吧。基本上一個小小的庫也就用到這些功能。
新聞熱點
疑難解答