ESPacket.php 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. <?php
  2. /**
  3. *ESPacket.php
  4. * 用于网络二进制收发包
  5. */
  6. class ESPacket {
  7. const SERVER_PACEKTVER = 1;
  8. const PACKET_BUFFER_SIZE = 150000;
  9. const PACKET_HEADER_SIZE = 15;
  10. private $m_packetBuffer;
  11. private $m_packetSize;
  12. private $m_CmdType;
  13. private $m_version;
  14. public function __construct(){
  15. $this->m_packetSize = 0;
  16. $this->m_packetBuffer = "";
  17. $this->m_version = self::SERVER_PACEKTVER;
  18. $this->m_CmdType = -1;
  19. }
  20. public function WriteBegin($CmdType, $version = self::SERVER_PACEKTVER){
  21. $this->m_CmdType = $CmdType;
  22. $this->m_version = $version;
  23. }
  24. public function WriteEnd(){
  25. //格式: 长度 + QE + version + extension + cmd + gameid + 验证码 + 数据
  26. $content = pack("N", $this->m_packetSize + self::PACKET_HEADER_SIZE - 4); //len
  27. $content .= "SA"; //QE
  28. $content .= pack("C", 1); //version
  29. $content .= pack("C", 0); //extension
  30. $content .= pack("N", $this->m_CmdType); //cmd
  31. $content .= pack("n", 1); //gameid
  32. $content .= pack("C", 1); //验证码
  33. $content .= $this->m_packetBuffer; //数据
  34. $this->m_packetBuffer = $content;
  35. }
  36. public function GetPacketBuffer(){
  37. return $this->m_packetBuffer;
  38. }
  39. public function GetPacketSize(){
  40. return $this->m_packetSize + self::PACKET_HEADER_SIZE;
  41. }
  42. public function WriteInt($value){
  43. $this->m_packetBuffer .= pack("N", $value);
  44. $this->m_packetSize += 4;
  45. }
  46. public function WriteInt64($value){
  47. // $high = intval($value / (1<<32));
  48. // $low = $value & ((1<<32)-1);
  49. // $this->m_packetBuffer .= pack("N", $high);
  50. // $this->m_packetBuffer .= pack("N", $low);
  51. // $this->m_packetSize += 8;
  52. $str = pack("N",$value>>32);
  53. $str .= pack("N",$value&0xffffffff);
  54. $this->m_packetBuffer .= $str;
  55. $this->m_packetSize += 8;
  56. }
  57. public function WriteByte($value){
  58. $this->m_packetBuffer .= pack("C", $value);
  59. $this->m_packetSize += 1;
  60. }
  61. public function WriteShort($value){
  62. $this->m_packetBuffer .= pack("n", $value);
  63. $this->m_packetSize += 2;
  64. }
  65. public function WriteString($value){
  66. $len = strlen($value)+1;
  67. $this->m_packetBuffer .= pack("N", $len);
  68. $this->m_packetBuffer .= $value;
  69. $this->m_packetBuffer .= pack("C", 0);
  70. $this->m_packetSize += $len+4;
  71. }
  72. public function ParsePacket(){
  73. if( $this->m_packetSize < self::PACKET_HEADER_SIZE ){
  74. return -1;
  75. }
  76. $header = substr($this->m_packetBuffer, 0, self::PACKET_HEADER_SIZE);
  77. $arr = unpack("NLen/c2Iden/cVer/cSubVer/NCmdType/nGameId/cCode", $header);
  78. if($arr['Iden1'] != ord('S') || $arr['Iden2'] != ord('A')){
  79. return -2;
  80. }
  81. $this->m_CmdType = $arr['CmdType'];
  82. if ($arr['Ver'] != $this->m_version ){
  83. return -3;
  84. }
  85. if($arr['Len'] >= 0 && $arr['Len'] > self::PACKET_BUFFER_SIZE - self::PACKET_HEADER_SIZE ){
  86. return -4;
  87. }
  88. $this->m_packetBuffer = substr($this->m_packetBuffer, self::PACKET_HEADER_SIZE);
  89. return 0;
  90. }
  91. public function SetRecvPacketBuffer($packet_buff, $packet_size){
  92. $this->m_packetBuffer = $packet_buff;
  93. $this->m_packetSize = $packet_size;
  94. }
  95. public function ReadInt(){
  96. $temp = substr($this->m_packetBuffer, 0, 4);
  97. $value = unpack("N", $temp);
  98. $this->m_packetBuffer = substr($this->m_packetBuffer, 4);
  99. return $value[1];
  100. }
  101. public function ReadInt64(){
  102. $high = self::ReadInt();
  103. $low = self::ReadInt();
  104. return $high*(1<<32) + $low;
  105. }
  106. public function ReadShort(){
  107. $temp = substr($this->m_packetBuffer, 0, 2);
  108. $value = unpack("n", $temp);
  109. $this->m_packetBuffer = substr($this->m_packetBuffer, 2);
  110. return $value[1];
  111. }
  112. public function ReadString(){
  113. $len = $this->ReadInt();
  114. $value = substr($this->m_packetBuffer, 0, $len-1);
  115. $this->m_packetBuffer = substr($this->m_packetBuffer, $len);
  116. return $value;
  117. }
  118. public function ReadByte(){
  119. $temp = substr($this->m_packetBuffer, 0, 1);
  120. $value = unpack("C", $temp);
  121. $this->m_packetBuffer = substr($this->m_packetBuffer, 1);
  122. return $value[1];
  123. }
  124. public function GetCmd(){
  125. return $this->m_CmdType;
  126. }
  127. }