diff --git a/test.py b/test.py new file mode 100644 index 0000000..c0b2ce6 --- /dev/null +++ b/test.py @@ -0,0 +1,212 @@ +#!/bin/python3 + +import signal +import socket +import sys +import os + +from ctypes import * + +import threading + +so_libskiplist_path = './libskiplist.so' + +lib = cdll.LoadLibrary(so_libskiplist_path) + +skiplist_cmp_t = CFUNCTYPE(c_int,c_void_p,c_void_p) + +lib.skiplist_create.restype = c_int +lib.skiplist_create.argtypes = [c_void_p,c_double,c_void_p] + +lib.skiplist_insert.restype = c_int +lib.skiplist_insert.argtypes = [c_void_p,c_void_p,c_void_p] + +lib.skiplist_erase.restype = c_int +lib.skiplist_erase.argtypes = [c_void_p,c_void_p,c_void_p] + +lib.skiplist_exist.restype = c_int +lib.skiplist_exist.argtypes = [c_void_p,c_void_p,c_void_p] + +lib.skiplist_begin.restype = c_int +lib.skiplist_begin.argtypes = [c_void_p,c_void_p] + +lib.skiplist_end.restype = c_int +lib.skiplist_end.argtypes = [c_void_p,c_void_p] + +lib.skiplist_iterator_equal.restype = c_int +lib.skiplist_iterator_equal.argtypes = [c_void_p,c_void_p] + +lib.skiplist_iterator_value.restype = c_void_p +lib.skiplist_iterator_value.argtypes = [c_void_p] + +lib.skiplist_iterator_next.argtypes = [c_void_p] + +lib.skiplist_iterator_prev.argtypes = [c_void_p] + +lib.skiplist_destroy.restype = c_int +lib.skiplist_destroy.argtypes = [c_void_p] + +c_int_p = POINTER(c_int) + +def __int_cmp(a,b): + _a = cast(a,c_int_p) + _b = cast(b,c_int_p) + return _a.contents.value - _b.contents.value + +def __int_show(v): + _v = cast(v,c_int_p) + print(_v.contents.value,end=" ") + +int_cmp = skiplist_cmp_t(__int_cmp) +HOST = '0.0.0.0' +PORT = 8001 + +class int_set: + + class iterator: + + def __init__(self,show): + self.it = c_void_p() + self._show = show + return + + def __eq__(self,o): + return (lib.skiplist_iterator_equal(addressof(self.it),addressof(o.it)) == 1) + + def next(self): + lib.skiplist_iterator_next(addressof(self.it)) + return + + def prev(self): + lib.skiplist_iterator_prev(addressof(self.it)) + return + + def value(self): + pvalue = lib.skiplist_iterator_value(addressof(self.it)) + _v = cast(pvalue,c_int_p) + v = int(_v.contents.value) + return v + + def show(self): + pvalue = lib.skiplist_iterator_value(addressof(self.it)) + self._show(pvalue) + return + + def __init__(self,int_cmp): + self.sl = c_void_p() + self.array = [] + self.errno = lib.skiplist_create(addressof(self.sl),0.25,int_cmp) + return + + def __del__(self): + errno = lib.skiplist_destroy(addressof(self.sl)) + return + + def begin(self,it): + errno = lib.skiplist_begin(self.sl,addressof(it.it)) + return + + def end(self,it): + errno = lib.skiplist_end(self.sl,addressof(it.it)) + return + + def insert(self,key): + self.array.append(c_int(key)) + errno = lib.skiplist_insert(self.sl,addressof(self.array[len(self.array) - 1]),addressof(self.array[len(self.array) - 1])) + if errno != 0: + self.array.pop() + return + + def erase(self,key,ret): + _key = c_int(key) + retvalue = c_int(0) + errno = lib.skiplist_erase(self.sl,address(_key),addressof(retvalue)) + if errno == 0 : + ret = int(retvalue) + return True + else : + ret = -1 + return False + + def exist(self,key,ret): + _key = c_int(key) + retvalue = c_int(0) + errno = lib.skiplist_exist(self.sl,addressof(_key),addressof(retvalue)) + if errno == 0 : + return True + else : + return False + +s = int_set(int_cmp) + +conn_pool = [] + +number = 65536 + +class MyThread(threading.Thread): + + lock = threading.Lock() + + def __init__(self,conn): + super(MyThread,self).__init__() + self.conn = conn + return + + def run(self): + while True: + request = self.conn.recv(1024) + string = request.decode("UTF-8") + if len(string) == 0: + break + if string.isdigit() == False: + print(string) + self.conn.sendall(bytes("不是数字","UTF-8")) + else: + val = int(string) + self.lock.acquire() + ret = c_void_p() + if s.exist(val,ret) == False: + s.insert(val) + if val == number : + self.conn.sendall(bytes("猜对了","UTF-8")) + for i in range(len(conn_pool)): + conn_pool[i].sendall(bytes("游戏结束","UTF-8")) + sys.exit() + elif val > number: + self.conn.sendall(bytes("大了","UTF-8")) + else : + self.conn.sendall(bytes("小了","UTF-8")) + else: + self.conn.sendall(bytes("重复了","UTF-8")) + self.lock.release() + return + +def main(): + global int_cmp + global HOST + global PORT + + signal.signal(signal.SIGPIPE,signal.SIG_IGN)#忽略半关闭写数据产生的 管道破裂信号 + + s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) + + s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,True) + + s.bind((HOST,PORT)) + + s.listen(3) + + while True : + + conn,addr = s.accept() #阻塞 在这 需要用 select 或者 epoll + + print("连接上了:",addr) + + conn_pool.append(conn) + + t = MyThread(conn) + + t.start() + +if __name__ == "__main__" : + main()