diff options
Diffstat (limited to 'examples/python/example.py')
| -rw-r--r-- | examples/python/example.py | 292 |
1 files changed, 145 insertions, 147 deletions
diff --git a/examples/python/example.py b/examples/python/example.py index e00ab35..ccecf3d 100644 --- a/examples/python/example.py +++ b/examples/python/example.py @@ -1,159 +1,157 @@ -import time, sys +'''Example low-level socket usage''' -import libzt - -# Where identity files are stored -keyPath = "." - -# Network to join -networkId = 0 - -# Port used by ZeroTier to send encpryted UDP traffic -# NOTE: Should be different from other instances of ZeroTier -# running on the same machine -ztServicePort = 9997 +import time +import sys -remoteIP = None - -# A port your app logic may use -serverPort = 8080 - -# Flags to keep state -is_joined = False -is_online = False -mode = None +import libzt def print_usage(): - print("\nUsage: <server|client> <id_path> <nwid> <ztServicePort> <remoteIP> <serverPort>\n") - print(" Ex: python3 example.py server . 0123456789abcdef 9994 8080") - print(" Ex: python3 example.py client . 0123456789abcdef 9994 192.168.22.1 8080\n") - if (len(sys.argv) < 6): - print('Too few arguments') - if (len(sys.argv) > 7): - print('Too many arguments') - exit(0) -# -if (len(sys.argv) < 6 or len(sys.argv) > 7): - print_usage() - -if (sys.argv[1] == 'server' and len(sys.argv) == 6): - mode = sys.argv[1] - keyPath = sys.argv[2] - networkId = int(sys.argv[3],16) - ztServicePort = int(sys.argv[4]) - serverPort = int(sys.argv[5]) - -if (sys.argv[1] == 'client' and len(sys.argv) == 7): - mode = sys.argv[1] - keyPath = sys.argv[2] - networkId = int(sys.argv[3],16) - ztServicePort = int(sys.argv[4]) - remoteIP = sys.argv[5] - serverPort = int(sys.argv[6]) - -if (mode is None): - print_usage() - -print('mode = ', mode) -print('path = ', keyPath) -print('networkId = ', networkId) -print('ztServicePort = ', ztServicePort) -print('remoteIP = ', remoteIP) -print('serverPort = ', serverPort) - - + '''print help''' + print( + "\nUsage: <server|client> <id_path> <nwid> <zt_service_port> <remote_ip> <remote_port>\n" + ) + print("Ex: python3 demo.py server . 0123456789abcdef 9994 8080") + print("Ex: python3 demo.py client . 0123456789abcdef 9994 192.168.22.1 8080\n") + if len(sys.argv) < 6: + print("Too few arguments") + if len(sys.argv) > 7: + print("Too many arguments") + sys.exit(0) + + +is_joined = False # Flags to keep state +is_online = False # Flags to keep state # # Event handler # class MyEventCallbackClass(libzt.EventCallbackClass): - def on_zerotier_event(self, msg): - global is_online - global is_joined - print("eventCode=", msg.eventCode) - if (msg.eventCode == libzt.ZTS_EVENT_NODE_ONLINE): - print("ZTS_EVENT_NODE_ONLINE") - print("nodeId="+hex(msg.node.address)) - # The node is now online, you can join/leave networks - is_online = True - if (msg.eventCode == libzt.ZTS_EVENT_NODE_OFFLINE): - print("ZTS_EVENT_NODE_OFFLINE") - if (msg.eventCode == libzt.ZTS_EVENT_NETWORK_READY_IP4): - print("ZTS_EVENT_NETWORK_READY_IP4") - is_joined = True - # The node has successfully joined a network and has an address - # you can perform network calls now - if (msg.eventCode == libzt.ZTS_EVENT_PEER_DIRECT): - print("ZTS_EVENT_PEER_DIRECT") - if (msg.eventCode == libzt.ZTS_EVENT_PEER_RELAY): - print("ZTS_EVENT_PEER_RELAY") - + def on_zerotier_event(self, msg): + global is_online + global is_joined + print("eventCode=", msg.eventCode) + if msg.eventCode == libzt.ZTS_EVENT_NODE_ONLINE: + print("ZTS_EVENT_NODE_ONLINE") + print("nodeId=" + hex(msg.node.address)) + # The node is now online, you can join/leave networks + is_online = True + if msg.eventCode == libzt.ZTS_EVENT_NODE_OFFLINE: + print("ZTS_EVENT_NODE_OFFLINE") + if msg.eventCode == libzt.ZTS_EVENT_NETWORK_READY_IP4: + print("ZTS_EVENT_NETWORK_READY_IP4") + is_joined = True + # The node has successfully joined a network and has an address + # you can perform network calls now + if msg.eventCode == libzt.ZTS_EVENT_PEER_DIRECT: + print("ZTS_EVENT_PEER_DIRECT") + if msg.eventCode == libzt.ZTS_EVENT_PEER_RELAY: + print("ZTS_EVENT_PEER_RELAY") - -# -# Example start and join logic # -print("Starting ZeroTier..."); -eventCallback = MyEventCallbackClass() -libzt.start(keyPath, eventCallback, ztServicePort) -print("Waiting for node to come online...") -while (not is_online): - time.sleep(1) -print("Joining network:", hex(networkId)); -libzt.join(networkId) -while (not is_joined): - time.sleep(1) # You can ping this app at this point -print('Joined network') - - - +# Main # -# Example server -# -if (mode == 'server'): - print("Starting server...") - serv = libzt.socket(libzt.ZTS_AF_INET, libzt.ZTS_SOCK_STREAM, 0) - try: - #serv.setblocking(True) - serv.bind(('::', serverPort)) - serv.listen(5) - while True: - conn, addr = serv.accept() - print('Accepted connection from: ', addr) - while True: - print('recv:') - data = conn.recv(4096) - if data: - print('data = ', data) - #print(type(b'what')) - #exit(0) - if not data: break - print('send:') - #bytes(data, 'ascii') + b'\x00' - n_bytes = conn.send(data) # echo back to the server - print('sent ' + str(n_bytes) + ' byte(s)') - conn.close() - print('client disconnected') - except Exception as e: - print(e) - print('errno=',libzt.errno()) # See include/ZeroTierSockets.h for codes - - -# -# Example client -# -if (mode == 'client'): - print("Starting client...") - client = libzt.socket(libzt.ZTS_AF_INET, libzt.ZTS_SOCK_STREAM, 0) - try: - print("connecting...") - client.connect((remoteIP, serverPort)) - print("send:") - data = 'Hello, world!' - client.send(data) - data = client.recv(1024) - print('Received', repr(data)) - except Exception as e: - print(e) - print('errno=',libzt.errno()) - +def main(): + global is_online + global is_joined + + key_file_path = "." # Where identity files are stored + network_id = 0 # Network to join + # Port used by ZeroTier to send encpryted UDP traffic + # NOTE: Should be different from other instances of ZeroTier + # running on the same machine + zt_service_port = 9997 + remote_ip = None # ZeroTier IP of remote node + remote_port = 8080 # ZeroTier port your app logic may use + mode = None # client|server + + if len(sys.argv) < 6 or len(sys.argv) > 7: + print_usage() + if sys.argv[1] == "server" and len(sys.argv) == 6: + mode = sys.argv[1] + key_file_path = sys.argv[2] + network_id = int(sys.argv[3], 16) + zt_service_port = int(sys.argv[4]) + remote_port = int(sys.argv[5]) + if sys.argv[1] == "client" and len(sys.argv) == 7: + mode = sys.argv[1] + key_file_path = sys.argv[2] + network_id = int(sys.argv[3], 16) + zt_service_port = int(sys.argv[4]) + remote_ip = sys.argv[5] + remote_port = int(sys.argv[6]) + if mode is None: + print_usage() + print("mode = ", mode) + print("path = ", key_file_path) + print("network_id = ", network_id) + print("zt_service_port = ", zt_service_port) + print("remote_ip = ", remote_ip) + print("remote_port = ", remote_port) + + # + # Example start and join logic + # + print("Starting ZeroTier...") + event_callback = MyEventCallbackClass() + libzt.start(key_file_path, event_callback, zt_service_port) + print("Waiting for node to come online...") + while not is_online: + time.sleep(1) + print("Joining network:", hex(network_id)) + libzt.join(network_id) + while not is_joined: + time.sleep(1) # You can ping this app at this point + print("Joined network") + + # + # Example server + # + if mode == "server": + print("Starting server...") + serv = libzt.socket(libzt.ZTS_AF_INET, libzt.ZTS_SOCK_STREAM, 0) + try: + # serv.setblocking(True) + serv.bind(("0.0.0.0", remote_port)) + serv.listen(5) + while True: + conn, addr = serv.accept() + print("Accepted connection from: ", addr) + while True: + print("recv:") + data = conn.recv(4096) + if data: + print("data = ", data) + # print(type(b'what')) + # exit(0) + if not data: + break + print("send:") + # bytes(data, 'ascii') + b'\x00' + n_bytes = conn.send(data) # echo back to the server + print("sent " + str(n_bytes) + " byte(s)") + conn.close() + print("client disconnected") + except Exception as ex: + print(ex) + print("errno=", libzt.errno()) # See include/ZeroTierSockets.h for codes + + # + # Example client + # + if mode == "client": + print("Starting client...") + client = libzt.socket(libzt.ZTS_AF_INET, libzt.ZTS_SOCK_STREAM, 0) + try: + print("connecting...") + client.connect((remote_ip, remote_port)) + print("send:") + data = "Hello, world!" + client.send(data) + data = client.recv(1024) + print("Received", repr(data)) + except Exception as ex: + print(ex) + print("errno=", libzt.errno()) + +if __name__ == "__main__": + main() |
