From 8623ecc4a071df6762806ca802cc292891c0d7a4 Mon Sep 17 00:00:00 2001 From: Robert Arkenin Date: Thu, 7 Mar 2013 18:41:55 -0500 Subject: [PATCH] Initial commit --- src/index.php | 61 ++++++-- src/knownMap.php | 5 + src/lowLevelNet.php | 7 + src/nbproject/configs/Arguments.properties | 0 src/network.php | 164 +++++++++++++++++++++ src/networkMaintenance.php | 15 ++ src/packet.php | 17 +++ src/processCommunication.php | 106 ++++++++++--- src/sendComm.php | 24 +++ src/serialize.php | 50 +++++++ src/servercommands.php | 2 +- src/testingground.php | 4 +- 12 files changed, 417 insertions(+), 38 deletions(-) create mode 100644 src/knownMap.php create mode 100644 src/lowLevelNet.php create mode 100644 src/nbproject/configs/Arguments.properties create mode 100644 src/network.php create mode 100644 src/networkMaintenance.php create mode 100644 src/packet.php create mode 100644 src/sendComm.php create mode 100644 src/serialize.php diff --git a/src/index.php b/src/index.php index 7bbd0c2..64abde4 100644 --- a/src/index.php +++ b/src/index.php @@ -1,27 +1,62 @@ "); + } $serverIp = $argv[1]; $serverPort = $argv[2]; -$controlFile = $argv[3]; +$username = $argv[3]; +$password = $argv[4]; +$controlFile = $argv[5]; $serverSocket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP); -if (false == (@socket_connect($serverSocket, $serverIp, $serverPort))) { - die("Connect [FATAL]:Connect failed: reason: " . socket_strerror(socket_last_error($serverSocket)) . "\n"); + +if (false == (socket_connect($serverSocket, $serverIp, $serverPort))) { + die("Connect [FATAL]:Connect failed: reason: " . socket_strerror(socket_last_error($serverSocket)) . "\n"); } -$controlHandle = fopen($controlFile, "rb"); -$fileReadBuffer = fread($controlHandle, 8); -if (strcasecmp($fileReadBuffer, "mtbotpurephp")!=0){ - die("File [FATAL]:Impropper file header, perhaps not a MTBot control file?"); +socket_set_nonblock($serverSocket); +//socket_write($serverSocket, "FOOBARFOOBAR"); +require_once $controlFile; +//$controlHandle = fopen($controlFile, "rb"); +//$fileReadBuffer = fread($controlHandle, 8); +//if (strcasecmp($fileReadBuffer, "mtbotpurephp")!=0){ +// die("File [FATAL]:Impropper file header, perhaps not a MTBot control file?"); +//} +////TODO: Get password from file +sendTOSERVER_INIT($username, $password); +//$connectSeqNum = sendPacket(FormReliablePacket(FormOriginalPacket(""))); +//blockingLoopWaitPacketAck($connectSeqNum); +//while($ourPeerId==0){ +// readNetworkPacket($serverSocket); +//} + +while(true){ + usleep(100); + readNetworkPacket($serverSocket); } ?> diff --git a/src/knownMap.php b/src/knownMap.php new file mode 100644 index 0000000..64387dd --- /dev/null +++ b/src/knownMap.php @@ -0,0 +1,5 @@ + diff --git a/src/lowLevelNet.php b/src/lowLevelNet.php new file mode 100644 index 0000000..3e558ca --- /dev/null +++ b/src/lowLevelNet.php @@ -0,0 +1,7 @@ + diff --git a/src/nbproject/configs/Arguments.properties b/src/nbproject/configs/Arguments.properties new file mode 100644 index 0000000..e69de29 diff --git a/src/network.php b/src/network.php new file mode 100644 index 0000000..cf677b1 --- /dev/null +++ b/src/network.php @@ -0,0 +1,164 @@ + 0) { + echo 'Got packet!'; + $protocolId = substr($packet, 0, 4); + $senderPeerId = deserializeU16(substr($packet, 4, 2)); + $channel = ord(substr($packet, 6, 1)); + $packetType = ord(substr($packet, 7, 1)); + switch ($packetType) { + case TYPE_CONTROL: + $controlType = ord(substr($packet, 8, 1)); + switch ($controlType) { + case CONTROLTYPE_ACK: + $seqnumAckd = deserializeU16(substr($packet, 9, 2)); + unset($packetsAwaitingSend[$seqnumAckd]); + break; + case CONTROLTYPE_SET_PEER_ID: + $peerId = deserializeU16(substr($packet, 9, 1)); + $ourPeerId = $peerId; + echo "Got our peer id!"; + return true; + break; + case CONTROLTYPE_DISCO: + exit("Disconnected."); + break; + } + break; + case TYPE_RELIABLE: + $incomingSeqnum = deserializeU16(substr($packet, 8, 1)); + sendAck($incomingSeqnum); + $packetPayload = substr($packet, 10); + if (isset($bufferedPackets[$seqnumIn])) { + $seqnumIn++; + $seqnumIn = $seqnumIn % 65536; + readNetworkPacket($bufferedPackets[$seqnumIn]); + } + + break; + case TYPE_ORIGINAL: + processCommandToClient(substr($packet, 8)); + break; + case TYPE_SPLIT: + //TODO Split packet + break; + default: + return false; + break; + } + } +} + +function readNetworkPacketNested($packIn) { + global $seqnumIn; + global $seqnumOut; + global $ourPeerId; + global $serverPeerId; + global $packetsAwaitingSend; + global $bufferedPackets; + $packetType = ord(substr($packet, 0, 1)); + switch ($packetType) { + case TYPE_CONTROL: + $controlType = ord(substr($packet, 1, 1)); + switch ($controlType) { + case CONTROLTYPE_ACK: + $seqnumAckd = deserializeU16(substr($packet, 2, 2)); + unset($packetsAwaitingSend[$seqnumAckd]); + case CONTROLTYPE_SET_PEER_ID: + $peerId = deserializeU16(substr($packet, 2, 2)); + $ourPeerId = $peerId; + echo "Got our peer ID!"; + return true; + break; + case CONTROLTYPE_DISCO: + exit("Disconnected."); + break; + } + break; + case TYPE_RELIABLE: + $incomingSeqnum = deserializeU16(substr($packet, 1, 1)); + sendAck($incomingSeqnum); + $packetPayload = substr($packet, 3); + if (isset($bufferedPackets[$seqnumIn])) { + $seqnumIn++; + $seqnumIn = $seqnumIn % 65536; + readNetworkPacketNested($bufferedPackets[$seqnumIn]); + } + + break; + case TYPE_ORIGINAL: + processCommandToClient(substr($packet, 1)); + break; + case TYPE_SPLIT: + //TODO Split packet + break; + default: + return false; + break; + } +} + +function sendPacket($packet) { + global $serverSocket; + socket_write($serverSocket, "\x4f\x45\x74\x03\x00\x01\x00" . $packet); +} + +function formReliablePacket($packet) { + global $seqnumOut; + $packetOut = chr(3) . serializeU16($seqnumOut) . $packet; + $seqnumOut++; + return $packetOut; +} + +function formOriginalPacket($packet) { + if(strlen($packet)!=0){ + return chr(1) . chr(0) . $packet; + } + else{ + return chr(1); + } +} + +function sendPing() { + global $serverSocket; + $pingPacket = "\x4f\x45\x74\x03\x00\x01\x00" . chr(TYPE_CONTROL) . chr(CONTROLTYPE_PING); + socket_write($serverSocket, $pingPacket); +} + +function sendAck($seqnumToAck) { + global $serverSocket; + $ackpacket = "\x4f\x45\x74\x03\x00\x01\x00" . chr(TYPE_CONTROL) . chr(CONTROLTYPE_ACK) . serializeU16($seqnumToAck); + socket_write($serverSocket, $ackPacket); +} + +?> diff --git a/src/networkMaintenance.php b/src/networkMaintenance.php new file mode 100644 index 0000000..ea8fad4 --- /dev/null +++ b/src/networkMaintenance.php @@ -0,0 +1,15 @@ + $data) { + FormReliablePacketWithSeqnum($seqnum, $data); + } + if ((microtime(true)-$lastSend)>=4){ + SendPing(); + } +} +//function +?> diff --git a/src/packet.php b/src/packet.php new file mode 100644 index 0000000..40d2c45 --- /dev/null +++ b/src/packet.php @@ -0,0 +1,17 @@ + diff --git a/src/processCommunication.php b/src/processCommunication.php index e3fa786..f63068b 100644 --- a/src/processCommunication.php +++ b/src/processCommunication.php @@ -1,41 +1,105 @@ diff --git a/src/sendComm.php b/src/sendComm.php new file mode 100644 index 0000000..80261d7 --- /dev/null +++ b/src/sendComm.php @@ -0,0 +1,24 @@ +player->pos->getAsV3F100(); +} + +?> diff --git a/src/serialize.php b/src/serialize.php new file mode 100644 index 0000000..d14a68c --- /dev/null +++ b/src/serialize.php @@ -0,0 +1,50 @@ + diff --git a/src/servercommands.php b/src/servercommands.php index 59e4d72..25cfe76 100644 --- a/src/servercommands.php +++ b/src/servercommands.php @@ -18,7 +18,7 @@ explicitly sent afterwards */ - define("CLIENT_BLOCKDATA",0x20); //TODO: Multiple blocks + define("CLIENT_BLOCKDATA",0x20); define("CLIENT_ADDNODE",0x21); define("CLIENT_REMOVENODE",0x22); diff --git a/src/testingground.php b/src/testingground.php index 1f83fcb..08b0ebc 100644 --- a/src/testingground.php +++ b/src/testingground.php @@ -1,5 +1,3 @@