public function call($service_name, $req, $ret, $namespace_ = "") { $socket = $this->ffsocket_connect(); //socket_create(AF_INET, SOCK_STREAM, SOL_TCP); if (!$socket) { return false; } $cmd = 5; $dest_msg_name = ''; if ($namespace_ != '') { $dest_msg_name = $namespace_ . "::" . $req->getName(); } else { $dest_msg_name = $req->getName(); } $dest_msg_body = ffrpc_t::encode_msg($req); $ffmsg = new ffrpc_msg\broker_route_msg_in_t(); $ffmsg->dest_namespace = $namespace_; $ffmsg->dest_service_name = $service_name; $ffmsg->dest_msg_name = $dest_msg_name; $ffmsg->dest_node_id = 0; $ffmsg->from_namespace = ''; $ffmsg->from_node_id = 0; $ffmsg->callback_id = 0; $ffmsg->body = $dest_msg_body; $ffmsg->err_info = ''; $body = ffrpc_t::encode_msg($ffmsg); $head = pack("Nnn", strlen($body), $cmd, 0); $data = $head . $body; if (false == $this->ffsocket_write($socket, $data)) { $this->ffsocket_close($socket); return false; } $head_recv = ''; $body_recv = ''; while (strlen($head_recv) < 8) { $tmp_data = $this->ffsocket_read($socket, 8 - strlen($head_recv)); if (false == $tmp_data) { $this->ffsocket_close($socket); return false; } $head_recv .= $tmp_data; } $head_parse = unpack('Nlen/ncmd/nres', $head_recv); $body_len = $head_parse['len']; $ret_cmd = $head_parse['cmd']; while (strlen($body_recv) < $body_len) { $tmp_data = $this->ffsocket_read($socket, $body_len - strlen($body_recv)); if (false == $tmp_data) { $this->ffsocket_close($socket); return false; } $body_recv .= $tmp_data; } $recv_msg = new ffrpc_msg\broker_route_msg_in_t(); if (false == ffrpc_t::decode_msg($recv_msg, $body_recv)) { $this->err_info = "recv data can't decode to broker_route_msg msg"; return false; } if ($recv_msg->err_info && $recv_msg->err_info != "") { $this->err_info = $recv_msg->err_info; return false; } if (false == ffrpc_t::decode_msg($ret, $recv_msg->body)) { $this->err_info = "recv data can't decode to msg"; return false; } $this->ffsocket_close($socket); if ($this->err_info != "") { return false; } return true; }
public function call($service_name, $req, $ret, $namespace_ = "") { //error_reporting(E_ALL); //echo "tcp/ip connection \n"; $socket = $this->ffsocket_connect(); //socket_create(AF_INET, SOCK_STREAM, SOL_TCP); if (!$socket) { //echo "socket_create() failed: reason: " . socket_strerror(socket_last_error()) . "\n"; //$this->err_info = "socket_create() failed."; //socket_close($socket); return false; } else { //echo "OK. \n"; } //echo "Attempting to connect to '$this->host' on port '$this->port'...\n"; /* $result = socket_connect($socket, $this->host, $this->port); if($result === false) { $this->err_info = "socket_connect() <$this->host:$this->port> failed." . socket_strerror(socket_last_error($socket)); socket_close($socket); return false; }*/ $cmd = 5; $dest_msg_body = ffrpc_t::encode_msg($req); $body = ''; //string dest_namespace; $body .= pack("N", 0); //string dest_service_name; $body .= pack("N", strlen($service_name)) . $service_name; //string dest_msg_name; if ($namespace_ != '') { $dest_msg_name = $namespace_ . "::" . $req->getName(); } else { $dest_msg_name = $req->getName(); } echo "{$dest_msg_name} {$namespace_} \n"; //debub print('dest_msg_name', dest_msg_name) $body .= pack("N", strlen($dest_msg_name)) . $dest_msg_name; //uint64_t dest_node_id; $body .= pack("N", 0) . pack("N", 0); //string from_namespace; $body .= pack("N", 0); //uint64_t from_node_id; $body .= pack("N", 0) . pack("N", 0); //int64_t callback_id; $body .= pack("N", 0) . pack("N", 0); //string body; $body .= pack("N", strlen($dest_msg_body)) . $dest_msg_body; //string err_info; $body .= pack("N", 0); $head = pack("Nnn", strlen($body), $cmd, 0); $data = $head . $body; $out = ""; //echo "sending http head request ...body_len=".strlen($body)."\n"; if (false == $this->ffsocket_write($socket, $data)) { //$this->err_info = "socket_write() failed." . socket_strerror(socket_last_error($socket)); //socket_close($socket); $this->ffsocket_close($socket); return false; } //echo "Reading response:\n"; //先读取包头,在读取body $head_recv = ''; $body_recv = ''; while (strlen($head_recv) < 8) { $tmp_data = $this->ffsocket_read($socket, 8 - strlen($head_recv)); if (false == $tmp_data) { //$this->err_info = "socket_read() head failed." . socket_strerror(socket_last_error($socket)); //socket_close($socket); $this->ffsocket_close($socket); return false; } $head_recv .= $tmp_data; } $head_parse = unpack('Nlen/ncmd/nres', $head_recv); $body_len = $head_parse['len']; $ret_cmd = $head_parse['cmd']; //echo "Reading response head.len='$body_len', head.cmd='$ret_cmd'\n"; //开始读取body while (strlen($body_recv) < $body_len) { $tmp_data = $this->ffsocket_read($socket, $body_len - strlen($body_recv)); if (false == $tmp_data) { //$this->err_info = "socket_read() head failed." . socket_strerror(socket_last_error($socket)); //socket_close($socket); $this->ffsocket_close($socket); return false; } $body_recv .= $tmp_data; } //echo "Reading response body_len=".strlen($body_recv)."\n"; //解析body $dest_service_name_len_data = substr($body_recv, 4, 8); $dest_service_name_len = unpack("Nlen", $dest_service_name_len_data); $dest_service_name_len = $dest_service_name_len["len"]; $dest_service_name = substr($body_recv, 8, $dest_service_name_len); //从dest_msg_name开始 //echo "service_len='$dest_service_name_len', service_naem='$dest_service_name'\n"; $dest_msg_name_field = substr($body_recv, 8 + $dest_service_name_len, 4); //从dest_msg_name开始 $dest_msg_name_len = unpack("Nlen", $dest_msg_name_field); $dest_msg_name_len = $dest_msg_name_len["len"]; $dest_msg_name_str = ''; $body_field_len_data = ''; if ($dest_msg_name_len > 0) { $dest_msg_name_str = substr($body_recv, $dest_service_name_len + 12, $dest_msg_name_len); $body_field_len_data = substr($body_recv, $dest_service_name_len + 12 + $dest_msg_name_len + 28, 4); } else { $body_field_len_data = substr($body_recv, $dest_service_name_len + 12 + 28, 4); } //echo "dest_msg_name_len='$dest_msg_name_len', dest_msg_name_str='$dest_msg_name_str'\n"; $body_field_len = unpack("Nlen", $body_field_len_data); $body_field_len = $body_field_len["len"]; $body_field_data = ''; //debub print('11111111111111111111 222222222') if ($body_field_len > 0) { $body_field_data = substr($body_recv, $dest_service_name_len + 12 + $dest_msg_name_len + 28 + 4, $body_field_len); } //echo "body_field_len='$body_field_len'\n"; if (false == ffrpc_t::decode_msg($ret, $body_field_data)) { $this->err_info = "recv data can't decode to msg"; return false; } //debub print('$body_field_data len=%d' % len($body_field_data), ret_msg) $this->err_info = substr($body_recv, $dest_service_name_len + 12 + $dest_msg_name_len + 28 + 4 + $body_field_len + 4); //echo "closeing socket..\n"; //socket_close($socket); $this->ffsocket_close($socket); //echo "ok .\n\n"; if ($this->err_info != "") { return false; } return true; }