1*4882a593Smuzhiyun#!/usr/bin/env python3 2*4882a593Smuzhiyun# 3*4882a593Smuzhiyun# SPDX-License-Identifier: GPL-2.0 4*4882a593Smuzhiyun# 5*4882a593Smuzhiyun 6*4882a593Smuzhiyunimport sys, os, os.path, getopt 7*4882a593Smuzhiyunimport socket, time 8*4882a593Smuzhiyunimport subprocess 9*4882a593Smuzhiyunimport select 10*4882a593Smuzhiyun 11*4882a593Smuzhiyundef read(sock, n): 12*4882a593Smuzhiyun buf = b'' 13*4882a593Smuzhiyun while len(buf) < n: 14*4882a593Smuzhiyun rem = n - len(buf) 15*4882a593Smuzhiyun try: s = sock.recv(rem) 16*4882a593Smuzhiyun except (socket.error) as e: return b'' 17*4882a593Smuzhiyun buf += s 18*4882a593Smuzhiyun return buf 19*4882a593Smuzhiyun 20*4882a593Smuzhiyundef send(sock, s): 21*4882a593Smuzhiyun total = len(s) 22*4882a593Smuzhiyun count = 0 23*4882a593Smuzhiyun while count < total: 24*4882a593Smuzhiyun try: n = sock.send(s) 25*4882a593Smuzhiyun except (socket.error) as e: n = 0 26*4882a593Smuzhiyun if n == 0: 27*4882a593Smuzhiyun return count; 28*4882a593Smuzhiyun count += n 29*4882a593Smuzhiyun return count 30*4882a593Smuzhiyun 31*4882a593Smuzhiyun 32*4882a593SmuzhiyunSERVER_PORT = 12877 33*4882a593SmuzhiyunMAX_PORTS = 2 34*4882a593Smuzhiyun 35*4882a593SmuzhiyunserverPort = SERVER_PORT 36*4882a593SmuzhiyunserverSocket = None 37*4882a593Smuzhiyun 38*4882a593Smuzhiyun# create passive socket 39*4882a593SmuzhiyunserverSocket = socket.socket(socket.AF_INET6, socket.SOCK_STREAM) 40*4882a593Smuzhiyun 41*4882a593Smuzhiyuntry: serverSocket.bind(('::1', 0)) 42*4882a593Smuzhiyunexcept socket.error as msg: 43*4882a593Smuzhiyun print('bind fails: ' + str(msg)) 44*4882a593Smuzhiyun 45*4882a593Smuzhiyunsn = serverSocket.getsockname() 46*4882a593SmuzhiyunserverPort = sn[1] 47*4882a593Smuzhiyun 48*4882a593SmuzhiyuncmdStr = ("./tcp_client.py %d &") % (serverPort) 49*4882a593Smuzhiyunos.system(cmdStr) 50*4882a593Smuzhiyun 51*4882a593Smuzhiyunbuf = b'' 52*4882a593Smuzhiyunn = 0 53*4882a593Smuzhiyunwhile n < 500: 54*4882a593Smuzhiyun buf += b'.' 55*4882a593Smuzhiyun n += 1 56*4882a593Smuzhiyun 57*4882a593SmuzhiyunserverSocket.listen(MAX_PORTS) 58*4882a593SmuzhiyunreadList = [serverSocket] 59*4882a593Smuzhiyun 60*4882a593Smuzhiyunwhile True: 61*4882a593Smuzhiyun readyRead, readyWrite, inError = \ 62*4882a593Smuzhiyun select.select(readList, [], [], 2) 63*4882a593Smuzhiyun 64*4882a593Smuzhiyun if len(readyRead) > 0: 65*4882a593Smuzhiyun waitCount = 0 66*4882a593Smuzhiyun for sock in readyRead: 67*4882a593Smuzhiyun if sock == serverSocket: 68*4882a593Smuzhiyun (clientSocket, address) = serverSocket.accept() 69*4882a593Smuzhiyun address = str(address[0]) 70*4882a593Smuzhiyun readList.append(clientSocket) 71*4882a593Smuzhiyun else: 72*4882a593Smuzhiyun sock.settimeout(1); 73*4882a593Smuzhiyun s = read(sock, 1000) 74*4882a593Smuzhiyun n = send(sock, buf) 75*4882a593Smuzhiyun sock.close() 76*4882a593Smuzhiyun serverSocket.close() 77*4882a593Smuzhiyun sys.exit(0) 78*4882a593Smuzhiyun else: 79*4882a593Smuzhiyun print('Select timeout!') 80*4882a593Smuzhiyun sys.exit(1) 81