You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

213 lines
4.6 KiB

#!/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()