} while (1) { $___TEMP_CONN_PORT_TRY = rand($room_poll_port_low, $room_poll_port_high); if (socket_bind($___TEMP_socket, '127.0.0.1', $___TEMP_CONN_PORT_TRY) !== false) { $___TEMP_CONN_PORT = $___TEMP_CONN_PORT_TRY; break; } } if (socket_listen($___TEMP_socket) === false) { ob_clean(); die; } $uid = uniqid('', true); $db->query("INSERT INTO {$gtablepre}roomlisteners (port,timestamp,roomid,uniqid) VALUES ('{$___TEMP_CONN_PORT}','{$timestamp}','{$roomid}','{$uid}')"); //等待30秒,没有接收到任何信息则直接退出 if (!__SOCKET_CHECK_WITH_TIMEOUT__($___TEMP_socket, 'a', 30, 0)) { $db->query("DELETE FROM {$gtablepre}roomlisteners WHERE (port,timestamp,roomid,uniqid) IN (('{$___TEMP_CONN_PORT}','{$timestamp}','{$roomid}','{$uid}'))"); ob_clean(); die; } if (!file_exists(GAME_ROOT . './gamedata/tmp/rooms/' . $roomid . '.txt')) { ob_clean(); die; } $result = $db->query("SELECT * FROM {$gtablepre}rooms WHERE roomid='{$roomid}'"); if (!$db->num_rows($result)) { ob_clean(); die; } $zz = $db->fetch_array($result); if ($zz['status'] == 0) {
eval(import_module('sys', 'map', 'player', 'logger', 'itemmain', 'input')); sys\routine(); $___TEMP_EXEC_START_TIME = microtime(); include GAME_ROOT . './command.php'; $___TEMP_WORKFLAG = 0; $___TEMP_tiused = get_script_runtime($___TEMP_EXEC_START_TIME); __SOCKET_DEBUGLOG__("执行完成。command.php本体耗时 " . $___TEMP_tiused . " 秒。"); $jgamedata = ob_get_contents(); ob_end_flush(); if ($___MOD_CONN_W_DB) { $___TEMP_db->query("UPDATE {$___TEMP_tablepre}temp SET value='" . base64_encode($jgamedata) . "' WHERE sid='{$___TEMP_uid}'"); } else { writeover($___MOD_TMP_FILE_DIRECTORY . $___TEMP_uid, $jgamedata); } //返回消息给client if (!__SOCKET_CHECK_WITH_TIMEOUT__($___TEMP_connection, 'w', 0, 200000)) { //允许最多0.2秒等待,这应该已经非常非常宽松了…… __SOCKET_WARNLOG__("警告:socket_write等待时间过长。结束流程。"); } else { if (!socket_write($___TEMP_connection, $___MOD_CONN_PASSWD . '_ok' . "\n")) { __SOCKET_WARNLOG__("警告:socket_write失败。结束流程。"); } } } socket_close($___TEMP_connection); __SOCKET_DEBUGLOG__("关闭连接。"); if (defined('MOD_REPLAY') && $___MOD_SRV && $___MOD_CODE_ADV3) { if (!isset($jgamedata['url'])) { $pid = (int) $pid; if (!file_exists(GAME_ROOT . './gamedata/tmp/replay/' . $room_prefix . '_/' . $pid)) { create_dir(GAME_ROOT . './gamedata/tmp/replay/' . $room_prefix . '_/' . $pid);
function __SEND_TOUCH_CMD__($port) { $___TEMP_socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); if ($___TEMP_socket === false) { return "socket_create失败。"; } $___TEMP_connected = socket_connect($___TEMP_socket, '127.0.0.1', $port); if (!$___TEMP_connected) { return "socket_connect失败。"; } //允许3秒等待 if (!__SOCKET_CHECK_WITH_TIMEOUT__($___TEMP_socket, 'w', 3, 0)) { return "socket_write等待时间过长。"; } //发送消息给server global $___MOD_CONN_PASSWD; if (!socket_write($___TEMP_socket, $___MOD_CONN_PASSWD . 'touch' . "\n")) { return "socket_write失败"; } if (!__SOCKET_CHECK_WITH_TIMEOUT__($___TEMP_socket, 'r', 3, 0)) { return "socket_read等待时间过长。"; } $___TEMP_ret = socket_read($___TEMP_socket, 1024, PHP_NORMAL_READ); if ($___TEMP_ret === false) { socket_shutdown($___TEMP_socket); return "socket_read失败。"; } else { socket_shutdown($___TEMP_socket); if ($___TEMP_ret == "Received\n" || $___TEMP_ret == "Received_root\n") { if ($___TEMP_ret == "Received\n") { return 'ok'; } else { return 'ok_root'; } } else { return '回复信息异常。'; } } }