Beispiel #1
0
 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;
 }
Beispiel #2
0
 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;
 }