1. Гость, мы просим Вас ознакомиться с Правилами Форума и Отказом от ответственности!

Результаты поиска

  1. wsok
    P.S. Больше не могу на это смотреть. Если бы я разбирался хорошо в парсинге хекс данных, то и темы бы этой не было. Собственно данный форум и создан для того, чтоб люди могли получать конструктивную помощь на свои вопросы и желательно с примерами для ускорения процесса обучения. К сожалению самые продвинутые в этом плане люди тут, теперь используют данный форум не совсем по прямому назначению, осуществлять поддержку тех, кто только начинает постигать такие вещи, для них форум теперь что то вроде торговой площадки своих разработок и поделиться фрагментом кода, класса и т.п. для них одно и тоже, как и позволить залезть к себе в карман... жаль конечно, что DEV форум становится торговой площадкой. Насчет структуры я примерно понял, но пока плохо представляю практический пример такого такого рода, писать класс, это опять же нужно 100% понимать методы парсинга хекс данных, увы я пока в данном направлении вообще плохо продвинулся, единственное, что пока могу пытаться разобрать хекс методом тыка, как я это и делаю сейчас, хоть и понимаю, что с точки зрения тех, кто лучше понимает в этом деле, это по меньшей мере мазохизм, но... если нет конструктивных ответов, то и приходится, если мало информации на этот счет - страдать мазохизмом...
    Сообщение от: wsok, 15 фев 2015 в разделе: PW Вопросник
  2. wsok
    Именно. решил сделать как ты сказал, получил любопытный результат, однако на 144 все так же ломанный парсинг: 1.4.4 листинг: [IMG] 151 листинг: [IMG] ну и сам скрипт парсинга: <? function cuint($data) { if($data < 64) return strrev(pack("C", $data)); else if($data < 16384) return strrev(pack("S", ($data | 0x8000))); else if($data < 536870912) return strrev(pack("I", ($data | 0xC0000000))); return strrev(pack("c", -32) . pack("i", $data)); } $bdname = 'factioninfo'; $bdlen = pack("n*", strlen($bdname)+32768); $data = pack('N', -1) . $bdlen . $bdname . "\x00\x00\x00\x00"; $Socket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP); $Data = cuint(3055).cuint(strlen($data)).$data; if(socket_connect($Socket,"127.0.0.1","29400")) { socket_set_block($Socket); $send = socket_send($Socket,$Data,8192,0); $recv = socket_recv($Socket,$buf,8192,0); socket_set_nonblock($Socket); socket_close($Socket); } echo "Версия сервера 1.4.4(60)<br><br>"; $var = "Запрос: ".bin2hex($Data)."<br>-<br>"; $var2 = "Ответ: ".bin2hex($buf)."<br>-<br>"; echo $var.$var2."<hr>"; echo "Попытка разобрать пакет с ответом: <hr>"; $strlarge = unpack( "H", substr( $buf, 2, 1 ) ); if(substr($strlarge[1], 0, 1) == "8") { $start = 13; } else { $start = 12; } $clancount = unpack( "c", substr( $buf, $start, 1 ) ); $start = $start+7; //точка отсчета и пропускаем 7 байтов (пока не понял для чего они) for($c=0; $i<$clancount[1]; $i++) { $clanid = unpack( "N*", substr( $buf, $start, 4 ) ); $start = $start+4; $namelarge = unpack( "c*", substr( $buf, $start, 4 ) ); $start = $start+1; $clanname = iconv( "UTF-16", "UTF-8", substr( $buf, $start, $namelarge[1] ) ); $start = $start+$namelarge[1]; $clan2 = unpack( "C*", substr( $buf, $start, 4 ) ); $start = $start+1; $clan3 = unpack( "N*", substr( $buf, $start, 4 ) ); $start = $start+1; $clan4 = unpack( "N*", substr( $buf, $start, 4 ) ); $start = $start+1; $clan5 = unpack( "N*", substr( $buf, $start, 4 ) ); $start = $start+1; $clan6 = unpack( "N*", substr( $buf, $start, 4 ) ); $start = $start+1; $clan7 = unpack( "N*", substr( $buf, $start, 4 ) ); $start = $start+1; $clan8 = unpack( "N*", substr( $buf, $start, 4 ) ); $start = $start+1; $clan9 = unpack( "N*", substr( $buf, $start, 4 ) ); $start = $start+1; $clan10 = unpack( "N*", substr( $buf, $start, 4 ) ); $start = $start+1; $clan11 = unpack( "N*", substr( $buf, $start, 4 ) ); $start = $start+1; $clan12 = unpack( "N*", substr( $buf, $start, 4 ) ); $start = $start+1; $clan13 = unpack( "N*", substr( $buf, $start, 4 ) ); $start = $start+1; $namelarge2 = unpack( "c*", substr( $buf, $start, 4 ) ); $start = $start+1; $news = iconv( "UTF-16", "UTF-8", substr( $buf, $start, $namelarge2[1] ) ); $start = $start+$namelarge2[1]+1; $clan14 = unpack( "N*", substr( $buf, $start, 4 ) ); $start = $start+1; $clan15 = unpack( "N*", substr( $buf, $start, 4 ) ); $start = $start+1; $clan16 = unpack( "N*", substr( $buf, $start, 4 ) ); $start = $start+1; $clan17 = unpack( "N*", substr( $buf, $start, 4 ) ); $start = $start+1; $clan18 = unpack( "N*", substr( $buf, $start, 4 ) ); $start = $start+1; $clan19 = unpack( "N*", substr( $buf, $start, 4 ) ); $start = $start+1; $clan_list .="<font color='red'>[ {$clanid[1]} ] {$clanname} | {$clan2[1]} | {$clan3[1]} | {$clan4[1]} | {$clan5[1]} | {$clan6[1]} | {$clan7[1]} | {$clan8[1]} | {$clan9[1]} | {$clan10[1]} | {$clan11[1]} | {$clan12[1]} | {$clan13[1]} | {$news} | {$clan14[1]} | {$clan15[1]} | {$clan16[1]} | {$clan17[1]} | {$clan18[1]} | {$clan19[1]}</font><hr>"; } echo $clan_list; ?> вроде почти каждый байт декодировал (кроме 7 байтов до цикла), но на 144 все равно ломается парсинг данных. Как говорил alexdnepro, сначала нужно написать класс для удобной работы с пакетами, а потом уже разбирать пакеты или писать их по структуре. у алекса хорошее чувство юмора, что сделать класс такой, надо примерно понять мне как парсить данные. Иначе не представляю для себя эту возню с написанием класса. --- добавлено: 15 фев 2015 в 17:57 --- Эм, vieraw же писал. Данный пакет представляет из себя: opcode - cuint длина - cuint max - int retcode - int handle - octets информация о кланах - vector Плюс ко всему, очень непонятно: ты читаешь 4 байта, а смещаешь на 1. $clan13 = unpack( "N*", substr( $buf, $start, 4 ) ); $start = $start+1; хочешь сказать, смещать не нужно вообще?
    Сообщение от: wsok, 15 фев 2015 в разделе: PW Вопросник
  3. wsok
    Действительно, почему ты пропускаешь? На стороне сервера используется маршалинг, а не тупо запись байт, взятых с потолка, в поток. Там может лежать, что угодно. Нельзя так просто сидеть и гадать. предлагаешь не пропускать, а пытаться раскодировать байты, которые встречаются на пути цикла? Именно. решил сделать как ты сказал, получил любопытный результат, однако на 144 все так же ломанный парсинг: 1.4.4 листинг: [IMG] 151 листинг: [IMG] ну и сам скрипт парсинга: <? function cuint($data) { if($data < 64) return strrev(pack("C", $data)); else if($data < 16384) return strrev(pack("S", ($data | 0x8000))); else if($data < 536870912) return strrev(pack("I", ($data | 0xC0000000))); return strrev(pack("c", -32) . pack("i", $data)); } $bdname = 'factioninfo'; $bdlen = pack("n*", strlen($bdname)+32768); $data = pack('N', -1) . $bdlen . $bdname . "\x00\x00\x00\x00"; $Socket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP); $Data = cuint(3055).cuint(strlen($data)).$data; if(socket_connect($Socket,"127.0.0.1","29400")) { socket_set_block($Socket); $send = socket_send($Socket,$Data,8192,0); $recv = socket_recv($Socket,$buf,8192,0); socket_set_nonblock($Socket); socket_close($Socket); } echo "Версия сервера 1.4.4(60)<br><br>"; $var = "Запрос: ".bin2hex($Data)."<br>-<br>"; $var2 = "Ответ: ".bin2hex($buf)."<br>-<br>"; echo $var.$var2."<hr>"; echo "Попытка разобрать пакет с ответом: <hr>"; $strlarge = unpack( "H", substr( $buf, 2, 1 ) ); if(substr($strlarge[1], 0, 1) == "8") { $start = 13; } else { $start = 12; } $clancount = unpack( "c", substr( $buf, $start, 1 ) ); $start = $start+7; //точка отсчета и пропускаем 7 байтов (пока не понял для чего они) for($c=0; $i<$clancount[1]; $i++) { $clanid = unpack( "N*", substr( $buf, $start, 4 ) ); $start = $start+4; $namelarge = unpack( "c*", substr( $buf, $start, 4 ) ); $start = $start+1; $clanname = iconv( "UTF-16", "UTF-8", substr( $buf, $start, $namelarge[1] ) ); $start = $start+$namelarge[1]; $clan2 = unpack( "C*", substr( $buf, $start, 4 ) ); $start = $start+1; $clan3 = unpack( "N*", substr( $buf, $start, 4 ) ); $start = $start+1; $clan4 = unpack( "N*", substr( $buf, $start, 4 ) ); $start = $start+1; $clan5 = unpack( "N*", substr( $buf, $start, 4 ) ); $start = $start+1; $clan6 = unpack( "N*", substr( $buf, $start, 4 ) ); $start = $start+1; $clan7 = unpack( "N*", substr( $buf, $start, 4 ) ); $start = $start+1; $clan8 = unpack( "N*", substr( $buf, $start, 4 ) ); $start = $start+1; $clan9 = unpack( "N*", substr( $buf, $start, 4 ) ); $start = $start+1; $clan10 = unpack( "N*", substr( $buf, $start, 4 ) ); $start = $start+1; $clan11 = unpack( "N*", substr( $buf, $start, 4 ) ); $start = $start+1; $clan12 = unpack( "N*", substr( $buf, $start, 4 ) ); $start = $start+1; $clan13 = unpack( "N*", substr( $buf, $start, 4 ) ); $start = $start+1; $namelarge2 = unpack( "c*", substr( $buf, $start, 4 ) ); $start = $start+1; $news = iconv( "UTF-16", "UTF-8", substr( $buf, $start, $namelarge2[1] ) ); $start = $start+$namelarge2[1]+1; $clan14 = unpack( "N*", substr( $buf, $start, 4 ) ); $start = $start+1; $clan15 = unpack( "N*", substr( $buf, $start, 4 ) ); $start = $start+1; $clan16 = unpack( "N*", substr( $buf, $start, 4 ) ); $start = $start+1; $clan17 = unpack( "N*", substr( $buf, $start, 4 ) ); $start = $start+1; $clan18 = unpack( "N*", substr( $buf, $start, 4 ) ); $start = $start+1; $clan19 = unpack( "N*", substr( $buf, $start, 4 ) ); $start = $start+1; $clan_list .="<font color='red'>[ {$clanid[1]} ] {$clanname} | {$clan2[1]} | {$clan3[1]} | {$clan4[1]} | {$clan5[1]} | {$clan6[1]} | {$clan7[1]} | {$clan8[1]} | {$clan9[1]} | {$clan10[1]} | {$clan11[1]} | {$clan12[1]} | {$clan13[1]} | {$news} | {$clan14[1]} | {$clan15[1]} | {$clan16[1]} | {$clan17[1]} | {$clan18[1]} | {$clan19[1]}</font><hr>"; } echo $clan_list; ?> вроде почти каждый байт декодировал (кроме 7 байтов до цикла), но на 144 все равно ломается парсинг данных.
    Сообщение от: wsok, 15 фев 2015 в разделе: PW Вопросник
  4. wsok
  5. wsok
    Хочешь сказать, что в целом при обработке хекса с 1.5.1 у меня ошибок нет, просто в 1.4.4 придется немного изменить перемещение по байтам. Разная структура пакетов 144 и 151? Я не смотрел код, так как не шарю в php, но по результату парсинга видно, что первый клан читается нормально, а остальные - нет. Это означает, что длина описания одного клана разная, поэтому начиная со второго клана идёт сдвиг, который и ломает всё. Можно наугад менять кол-во "пропускаемых ненужных байт", скорее всего получится Но это только мои предположения но странно, что в 151 без проблем парсится, хоть и ожидалось, что структура пакетов в 151 может быть более мудренная,чем в 144. Все же интересно увидеть конструктивный ответ, который поможет понять как же решить проблему?
    Сообщение от: wsok, 15 фев 2015 в разделе: PW Вопросник
  6. wsok
  7. wsok
    пробую понять, как работать с хекс данными игровой базы на примере списка кланов... Имею две машины, на одной сборка 1.4.4 на второй 1.5.1, скрипт в котором пытаюсь разбирать данные один и тот же: <? function cuint($data) { if($data < 64) return strrev(pack("C", $data)); else if($data < 16384) return strrev(pack("S", ($data | 0x8000))); else if($data < 536870912) return strrev(pack("I", ($data | 0xC0000000))); return strrev(pack("c", -32) . pack("i", $data)); } $bdname = 'factioninfo'; $bdlen = pack("n*", strlen($bdname)+32768); $data = pack('N', -1) . $bdlen . $bdname . "\x00\x00\x00\x00"; $Socket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP); $Data = cuint(3055).cuint(strlen($data)).$data; if(socket_connect($Socket,"127.0.0.1","29400")) { socket_set_block($Socket); $send = socket_send($Socket,$Data,8192,0); $recv = socket_recv($Socket,$buf,8192,0); socket_set_nonblock($Socket); socket_close($Socket); } echo "Версия сервера 1.5.1(101)<br><br>"; $var = "Запрос: ".bin2hex($Data)."<br>-<br>"; $var2 = "Ответ: ".bin2hex($buf)."<br>-<br>"; echo $var.$var2."<hr>"; echo "Попытка разобрать пакет с ответом: <hr>"; $strlarge = unpack( "H", substr( $buf, 2, 1 ) ); if(substr($strlarge[1], 0, 1) == "8") { $start = 13; } else { $start = 12; } $clancount = unpack( "c", substr( $buf, $start, 1 ) ); $start = $start+7; //точка отсчета и пропускаем 7 байтов (пока не понял для чего они) for($c=0; $i<$clancount[1]; $i++) { $clanid = unpack( "N*", substr( $buf, $start, 4 ) ); $start = $start+4; $namelarge = unpack( "c*", substr( $buf, $start, 4 ) ); $start = $start+1; $clanname = iconv( "UTF-16", "UTF-8", substr( $buf, $start, $namelarge[1] ) ); $start = $start+$namelarge[1]; $clan2 = unpack( "C*", substr( $buf, $start, 4 ) ); $start = $start+1; $clan3 = unpack( "N*", substr( $buf, $start, 4 ) ); $start = $start+11; //точка отсчета и пропускаем 11 байтов (пока не понял для чего они) $namelarge2 = unpack( "c*", substr( $buf, $start, 4 ) ); $start = $start+1; $news = iconv( "UTF-16", "UTF-8", substr( $buf, $start, $namelarge2[1] ) ); $start = $start+$namelarge2[1]; $start = $start+7; //точка отсчета и пропускаем 7 байтов (пока не понял для чего они) $clan_list .="<font color='red'>[ {$clanid[1]} ] {$clanname} {$clan2[1]} {$clan3[1]} {$news}</font><hr>"; } echo $clan_list; ?> в общем, испытав его на 1.5.1, немного обрадовался, так как получил листинг кланов: [IMG] но, разочаровался, когда запустил его на 1.4.4: [IMG] Как видно, только первую запись скрипт декодировал нормально, остальные записи увы нет... И ещё для информации, на обоих серверах по 6 кланов, однако на 1.5.1 было 2 клана, я довел их количество до 6, после создания каждого клана проверял листинг в скрипте, он показывал корректно 3, 4, 5 и 6 кланов. До этого я полагал, что причина ошибки в 1.4.4 из за того, что там 6 кланов и дело в длине пакета, оказалось, что видимо это не так, ведь на 1.5.1 сейчас тоже 6 кланов и они отображаются в скрипте нормально. Так что я порядком уже запутался, в чем же дело?
    Автор темы: wsok, 15 фев 2015, ответов - 30, в разделе: PW Вопросник
  8. wsok
  9. wsok
    А если так? echo passthru("/pwserver/gamedbd/ /pwserver/gamedbd/gamesys.conf listfaction"); запрос у тебя немного неверный, сам то проверял? Но суть не в этом, а в другом, перечитай все мои посты и увидишь, что я уже и подобный запрос юзал А ты после того как начал гонять эту команду через пхп проверял потом в консоли? После 3-5 выводов база частенько "запирается" и перестает выдавать ответ на подобные запросы. Ну или попробуй вариант через екзек exec("cd /home/gamedbd && ./gamedbd gamesys.conf listfaction", $arr); Если бы вы читали все мои посты, то наверняка бы увидели бы, что я уже писал, что в консоли проверял и все работает, только в браузере не пашет и выдает ошибку 134. --- добавлено: 15 фев 2015 в 07:14 --- А если так? echo passthru("/pwserver/gamedbd/ /pwserver/gamedbd/gamesys.conf listfaction"); запрос у тебя немного неверный, сам то проверял? Но суть не в этом, а в другом, перечитай все мои посты и увидишь, что я уже и подобный запрос юзал /pwserver/gamedbd/gamedbd /pwserver/gamedbd/gamesys.conf listfaction как всегда, в консоли прекрасно пашет, из скрипта в браузере ошибка 134... хз что за ошибка...chmod 777 -R /home/gamedbd/ смеёшся? )) вся папка с её содержимым давно уже имеет 777 )
    Сообщение от: wsok, 15 фев 2015 в разделе: PHP
  10. wsok
    На форуме есть бан чата по логам, там можно задавать метод по которому будет баниться чат, вот от wsok как раз. Найдешь. А бад слова добавишь 1010100 или какие там повторяются. ну мой скрипт не будет 100% решением, он парсит то, что уже есть в логах чата, т.е. то что уже отправили, а как писал ТС, там за секунду десятки раз флуд, пока мой скрипт сработает, клиент уже может отвалится. Мой скрипт скорее создан, чтоб немного упростить работу ГМам, которые следят за порядком в игре. По проблеме ТСа нужно более конструктивное решение, например пакетный автобан с возможностью указать какой чат канал нужно мониторить и при этом, он чтоб работал в режиме проксирования чат трафика от игрового клиента. Ну или фиксить бинарные файлы сервера, отвечающие за чат, чтоб интервальная защита от флуда была не только в мировом чате, но и в других.
    Сообщение от: wsok, 15 фев 2015 в разделе: PW Вопросник
  11. wsok
    А ты после того как начал гонять эту команду через пхп проверял потом в консоли? После 3-5 выводов база частенько "запирается" и перестает выдавать ответ на подобные запросы. Ну или попробуй вариант через екзек exec("cd /home/gamedbd && ./gamedbd gamesys.conf listfaction", $arr); Если бы вы читали все мои посты, то наверняка бы увидели бы, что я уже писал, что в консоли проверял и все работает, только в браузере не пашет и выдает ошибку 134. --- добавлено: 15 фев 2015 в 07:14 --- А если так? echo passthru("/pwserver/gamedbd/ /pwserver/gamedbd/gamesys.conf listfaction"); запрос у тебя немного неверный, сам то проверял? Но суть не в этом, а в другом, перечитай все мои посты и увидишь, что я уже и подобный запрос юзал /pwserver/gamedbd/gamedbd /pwserver/gamedbd/gamesys.conf listfaction как всегда, в консоли прекрасно пашет, из скрипта в браузере ошибка 134... хз что за ошибка...
    Сообщение от: wsok, 15 фев 2015 в разделе: PHP
  12. wsok
  13. wsok
    да ну, ты считаешь, что я вчера родился и сразу в пв пошел? Ну на всякий случай я проверил (хоть и знал, что пути там верные) http://joxi.ru/L21LJlOcR1R1mX так что ребус все ещё не решен) И меня не интересует кто использует этот способ и кто нет, мне нужен сам факт, почему функция тупит? Где косяк? Я не знаю что за магию ты практикуешь, но у меня все отлично работает. [IMG] [IMG] <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <?php ob_start(); passthru("/.../gamedbd/gamedbd /.../gamedbd/gamesys.conf listrolebrief"); $a1 = ob_get_clean(); echo "<pre>".$a1."</pre>"; ?> Вот мне и самому интересно, что же это за магия такая на моем сервере, которая мешает данной функции делать то, что раньше кстати работало... --- добавлено: 14 фев 2015 в 19:20 --- но в чудеса и мистику я не верю, поэтому должно быть логическое объяснение, почему в консоли та же команда выводит данные из игровой базы, а когда выполняю скрипт в браузере с той же командой, данные не получаю... забавно да? --- добавлено: 14 фев 2015 в 19:48 --- проверил ещё на 3 виртуалках, и о чудо, на одной из них скрипт вывел в браузер данные... на остальных машинах видимо и впрямь проклятие лежит )) --- добавлено: 14 фев 2015 в 19:49 --- в общем ребус не решен, пока непонятно что мешает ему?
    Сообщение от: wsok, 14 фев 2015 в разделе: PHP
  14. wsok
    Настрой пути в gamedbd -> gamesys.conf эх, неужели, если пути были бы неверные, в консоли бы вывело список? Более того скажу, проверил вызов скрипта пхп из консоли php /var/www/hn.wsok.net/html/l.php Список вывело там, вывод? с путями все нормально, а раз так, то почему выполнение в браузере так тупит? Настрой файл gamesys.conf, пропиши полный путь до базы (в самом конф. файле) [storage] homedir = /pw/db/gamedbd/dbhome datadir = /pw/db/gamedbd/dbdata logdir = /pw/db/gamedbd/dblogs backupdir = /pw/db/gamedbd/dbbackup ... [storagewdb] homedir = /pw/db/gamedbd/dbhomewdb datadir = /pw/db/gamedbd/dbdata logdir = /pw/db/gamedbd/dblogs backupdir = /pw/db/gamedbd/dbbackup Просто уже никто не пользуется варварскими методами, наверное. ти чта эта нексхен от батча да ну, ты считаешь, что я вчера родился и сразу в пв пошел? Ну на всякий случай я проверил (хоть и знал, что пути там верные) http://joxi.ru/L21LJlOcR1R1mX так что ребус все ещё не решен) И меня не интересует кто использует этот способ и кто нет, мне нужен сам факт, почему функция тупит? Где косяк?
    Сообщение от: wsok, 14 фев 2015 в разделе: PHP
  15. wsok
  16. wsok
  17. wsok
  18. wsok
    Памятуя старую темку от Ботчала - решил немного поиграть с пхп функцией passthru. В качестве команды использую: /pwserver/gamedbd/gamedbd /pwserver/gamedbd/gamesys.conf listfaction Когда выполнил в консоли сервера, то как и ожидалось получил список, чтож, хорошо, значит все норм, ошибок нет, решил её выполнить в пхп: echo passthru("/pwserver/gamedbd/gamedbd /pwserver/gamedbd/gamesys.conf listfaction"); И обломался, списка не увидел.. Вообще ничего не увидел, кроме белой страницы в браузере. Включил вывод ошибок пхп, все равно белая страница... Выставил на файлы, что вызываются командой и сам пхп файл права 777 и на папки тоже... Все равно белая страница... Подумал, может команда тупит? Решил проверить... echo passthru("ls"); браузер сразу вывел содержимое папки, значит все же ошибок нет? Тогда где же собака порылась? Помогите решить ребус. =)
    Автор темы: wsok, 14 фев 2015, ответов - 52, в разделе: PHP
  19. wsok
  20. wsok