Example #1
0
    def __init__(self, sock, ip, port):

        self.peer = Peer(ip, port)

        self.kcp = KcpObj(0x11223344, id(self), self)
        self.kcp.nodelay(1, 10, 2, 1)
        self.kcp.wndsize(128, 128)
        self.kcp.setmtu(1400)

        self.sock = sock
        self.mutex = threading.Lock()

        self.next = 0
        self.last_ping = get_current_time_sec()
Example #2
0
class KcpPeer:
    def __init__(self, sock, ip, port):

        self.peer = Peer(ip, port)

        self.kcp = KcpObj(0x11223344, id(self), self)
        self.kcp.nodelay(1, 10, 2, 1)
        self.kcp.wndsize(128, 128)
        self.kcp.setmtu(1400)

        self.sock = sock
        self.mutex = threading.Lock()

        self.next = 0
        self.last_ping = get_current_time_sec()

    def udp_output(self, data):
        return self.sock.sendto(data, (self.peer.ip, self.peer.port))

    def send(self, message_wrapper):

        if not isinstance(message_wrapper, MessageWrapper):
            return False

        with kcp_peer.mutex:
            result = kcp_peer.kcp.send(message_wrapper.get_coded_output())

        return result
Example #3
0
def recv_udp(sock):
    try:
        data, udp_addr = sock.recvfrom(65535)
        return data
    except Exception as e:
        pass
    return None


# socket连接
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.setblocking(0)
addr = ("127.0.0.1", 9999)

kcp = KcpObj(123, 1, kcp_callback)
kcp.nodelay(1, 10, 2, 1)
kcp.wndsize(128, 128)
kcp.setmtu(1000)

start_ts = getms()  # 获取代码运行一直到此时的时间差
slap = start_ts

while True:
    current = getms()
    kcp.update(time.time())

    while current >= slap:  # 发送sleep()/100次
        data = str(random.randint(0, 10000))
        print("Send: ", data)
        kcp.send(data)
Example #4
0
def test(mode):
    global g_oLsm
    initrndseed()
    g_oLsm = LatencySimulator(25, 80, 150)
    session = 123
    p1 = 1
    p2 = 2
    okcp1 = KcpObj(session, p1, kcp_callback)
    okcp2 = KcpObj(session, p2, kcp_callback)
    start_ts = getms()
    slap = start_ts + 20
    index = 0
    inext = 0
    count = 0
    sumrtt = 0
    maxrtt = 0
    okcp1.wndsize(128, 128)
    okcp2.wndsize(128, 128)

    if mode == 0:
        okcp1.nodelay(0, 10, 0, 0)
        okcp2.nodelay(0, 10, 0, 0)
    elif mode == 1:
        okcp1.nodelay(0, 10, 0, 1)
        okcp2.nodelay(0, 10, 0, 1)
    else:
        okcp1.nodelay(1, 10, 2, 1)
        okcp2.nodelay(1, 10, 2, 1)

    while True:
        current = getms()
        nextt1 = okcp1.check(current)
        nextt2 = okcp2.check(current)
        nextt = min(nextt1, nextt2)
        diff = nextt - current
        if diff > 0:
            msleep(diff)
            current = getms()

        okcp1.update(current)
        okcp2.update(current)

        ##每隔 20ms,okcp1发送数据
        while current >= slap:
            s1 = uint322netbytes(index)
            s2 = uint322netbytes(current)
            okcp1.send(s1 + s2)
            slap += 20
            index += 1

        #处理虚拟网络:检测是否有udp包从p1->p2
        while True:
            ilen, pkg = g_oLsm.recv(p2)
            if ilen < 0:
                break
            #如果 p2收到udp,则作为下层协议输入到okcp2
            okcp2.input(pkg)

        #处理虚拟网络:检测是否有udp包从p2->p1
        while True:
            ilen, pkg = g_oLsm.recv(p1)
            if ilen < 0:
                break
            #如果 p1收到udp,则作为下层协议输入到okcp1
            okcp1.input(pkg)

        #okcp2接收到任何包都返回回去
        while True:
            ilen, pkg = okcp2.recv()
            if ilen <= 0:
                break
            okcp2.send(pkg)

        #okcp1收到okcp2的回射数据
        while True:
            ilen, pkg = okcp1.recv()
            if ilen <= 0:
                break
            sn = netbytes2uint32(pkg[:4])
            ts = netbytes2uint32(pkg[4:8])
            rtt = current - ts
            if sn != inext:
                print "ERROR sn count %d %d!=%d\n" % (count, sn, inext)
                return
            inext += 1
            sumrtt += rtt
            count += 1
            if rtt > maxrtt:
                maxrtt = rtt
            print "[RECV] mode=%d sn=%d rtt=%d\n" % (mode, sn, rtt)

        if inext > 20:
            break

    cost = getms() - start_ts
    print "mode %d total %dms avgrtt=%d maxrtt=%d\n" % (mode, cost,
                                                        sumrtt / count, maxrtt)
    del okcp1
    del okcp2
Example #5
0
def recv_udp(sock):
    try:
        data, udp_addr = sock.recvfrom(1400)
        return data
    except Exception as e:
        pass
    return None


# socket连接
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.setblocking(0)
addr = ("127.0.0.1", 9191)

kcp = KcpObj(123, 1, kcp_callback)
kcp.nodelay(1, 10, 2, 1)
kcp.wndsize(128, 128)
kcp.setmtu(1400)

start_ts = getms()  # 获取代码运行一直到此时的时间差
slap = start_ts

# rList = list(range(256))*100
# print(len(rList))
# send_data = bytes(rList)

index = 0
while True:

    current = getms()