X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=doc%2Fprotocol.txt;h=b151f88d8b356d7941c777b9425e68b9363ef289;hb=3ef0b4e6379944ec7e3ccbfc7fe26ab7f9158fc9;hp=9dd1e4fbf5b92a4fcfd0898fc678c573a6ce6eae;hpb=50ef74da1eb922bccccd93b8289121d9d86b5664;p=minetest.git diff --git a/doc/protocol.txt b/doc/protocol.txt index 9dd1e4fbf..b151f88d8 100644 --- a/doc/protocol.txt +++ b/doc/protocol.txt @@ -1,7 +1,9 @@ -Minetest-c55 protocol (incomplete, early draft): +Minetest protocol (incomplete, early draft): Updated 2011-06-18 A custom protocol over UDP. +Integers are big endian. +Refer to connection.{h,cpp} for further reference. Initialization: - A dummy reliable packet with peer_id=PEER_ID_INEXISTENT=0 is sent to the server: @@ -40,5 +42,67 @@ Initialization: u8 channel = 0 # Control packet header u8 type = TYPE_CONTROL = 0 - u8 controltype = CONTROLTYPE_DISCO = 2 + u8 controltype = CONTROLTYPE_DISCO = 3 +- Here's a quick untested connect-disconnect done in PHP: +# host: ip of server (use gethostbyname(hostname) to get from a dns name) +# port: port of server +function check_if_minetestserver_up($host, $port) +{ + $socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP); + $timeout = array("sec" => 1, "usec" => 0); + socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, $timeout); + $buf = "\x4f\x45\x74\x03\x00\x00\x00\x03\xff\xdc\x01"; + socket_sendto($socket, $buf, strlen($buf), 0, $host, $port); + $buf = socket_read($socket, 1000); + if($buf != "") + { + # We got a reply! read the peer id from it. + $peer_id = substr($buf, 9, 2); + + # Disconnect + $buf = "\x4f\x45\x74\x03".$peer_id."\x00\x00\x03"; + socket_sendto($socket, $buf, strlen($buf), 0, $host, $port); + socket_close($socket); + + return true; + } + return false; +} + +- Here's a Python script for checking if a minetest server is up, confirmed working +#!/usr/bin/env python +import sys, time, socket +address = "" +port = 30000 +if len(sys.argv) <= 1: + print("Usage: %s
" % sys.argv[0]) + exit() +if ':' in sys.argv[1]: + address = sys.argv[1].split(':')[0] + try: + port = int(sys.argv[1].split(':')[1]) + except ValueError: + print("Please specify a valid port") + exit() +else: + address = sys.argv[1] + +try: + start = time.time() + sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + sock.settimeout(2.0) + buf = "\x4f\x45\x74\x03\x00\x00\x00\x01" + sock.sendto(buf, (address, port)) + data, addr = sock.recvfrom(1000) + if data: + peer_id = data[12:14] + buf = "\x4f\x45\x74\x03" + peer_id + "\x00\x00\x03" + sock.sendto(buf, (address, port)) + sock.close() + end = time.time() + print("%s is up (%0.5fms)" % (sys.argv[1],end-start)) + else: + print("%s seems to be down " % sys.argv[1]) +except: + print("%s seems to be down " % sys.argv[1])