#!/usr/bin/python import socket import struct SKEEP_ALIVE = socket.htonl(1) CKEEP_ALIVE = socket.htonl(2) HANDSHAKE = socket.htonl(3) SERVERSHAKE = socket.htonl(4) CLIENTSHAKE = socket.htonl(5) TERMINATE = socket.htonl(6) LIST_REQ = socket.htonl(7) LIST_RESP = socket.htonl(8) PROTO_ERANGE = socket.htonl(9) def metaquery(): ip = "80.68.90.68" port = 8453 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.sendto(struct.pack('I', CKEEP_ALIVE), (ip, port)) data,addr = s.recvfrom(8) res = struct.unpack('II', data) if res[0] != HANDSHAKE: print(socket.ntohl(res[0]), HANDSHAKE) print("no handshake") return print("handshook") shake = res[1] s.sendto(struct.pack('II', CLIENTSHAKE, shake), (ip, port)) print("listing") segment=0 while True: s.sendto(struct.pack('II', LIST_REQ, socket.htonl(segment)), (ip, port)) data,addr = s.recvfrom(4096) print(len(data)) res = struct.unpack('I', data[:4]) print(socket.ntohl(res[0])) if res[0] == LIST_RESP: payload = struct.unpack('II', data[4:12]) count = socket.ntohl(payload[1]) if len(data) != (12 + count * 4): print("Error: ", len(data), count * 4) return for i in range(0, count): entry = struct.unpack('BBBB', data[12+i*4:16+i*4]) print("%d.%d.%d.%d" % entry) segment += count print(segment, " got.") if segment == socket.ntohl(payload[0]): print("Done.") return metaquery()