orber_iiop_inproxy.erl
来自「OTP是开放电信平台的简称」· ERL 代码 · 共 399 行 · 第 1/2 页
ERL
399 行
%%--------------------------------------------------------------------%% ``The contents of this file are subject to the Erlang Public License,%% Version 1.1, (the "License"); you may not use this file except in%% compliance with the License. You should have received a copy of the%% Erlang Public License along with this software. If not, it can be%% retrieved via the world wide web at http://www.erlang.org/.%% %% Software distributed under the License is distributed on an "AS IS"%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See%% the License for the specific language governing rights and limitations%% under the License.%% %% The Initial Developer of the Original Code is Ericsson Utvecklings AB.%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings%% AB. All Rights Reserved.''%% %% $Id$%%%%-----------------------------------------------------------------%% File: orber_iiop_inproxy.erl%% %% Description:%% This file contains the IIOP "proxy" for incomming connections%%%% Creation date: 990425%%%%------------------------------------------------------------------module(orber_iiop_inproxy).-behaviour(gen_server).-include_lib("orber/src/orber_iiop.hrl").-include_lib("orber/include/corba.hrl").%%-----------------------------------------------------------------%% External exports%%------------------------------------------------------------------export([start/0, start/1]).%%-----------------------------------------------------------------%% Internal exports%%------------------------------------------------------------------export([init/1, handle_call/3, handle_cast/2, handle_info/2, code_change/3, terminate/2, post_accept/3, stop/1]).%%-----------------------------------------------------------------%% Macros%%------------------------------------------------------------------define(DEBUG_LEVEL, 7).-record(state, {stype, socket, db, timeout, max_fragments, max_requests, request_counter = 1, giop_env, peer}).%%-----------------------------------------------------------------%% External interface functions%%-----------------------------------------------------------------%%-----------------------------------------------------------------%% Func: start/0%%-----------------------------------------------------------------start() -> ignore.%%-----------------------------------------------------------------%% Func: start/1%%-----------------------------------------------------------------start(Opts) -> gen_server:start_link(orber_iiop_inproxy, Opts, []).post_accept(Pid, ssl, Socket) -> (catch gen_server:cast(Pid, {post_accept, ssl, Socket})), ok;post_accept(_, _, _) -> ok.%%-----------------------------------------------------------------%% Internal interface functions%%-----------------------------------------------------------------%%-----------------------------------------------------------------%% Func: stop/1%%-----------------------------------------------------------------stop(Pid) -> gen_server:cast(Pid, stop).%%-----------------------------------------------------------------%% Server functions%%-----------------------------------------------------------------%%-----------------------------------------------------------------%% Func: init/1%%-----------------------------------------------------------------init({connect, Type, Socket, Ref, Options}) -> process_flag(trap_exit, true), Flags = orber_tb:keysearch(flags, Options, orber_env:get_flags()), {Address, Port} = PeerData = orber_socket:peerdata(Type, Socket), {LAddress, LPort} = LocalData = orber_socket:sockdata(Type, Socket), case {?ORB_FLAG_TEST(Flags, ?ORB_ENV_LOCAL_INTERFACE), LPort} of {true, 0} -> orber_tb:info("Unable to lookup the local address and port number.~n" "Closing the incoming connection.", []), ignore; _ -> orber_iiop_net:add_connection(Socket, Type, PeerData, LocalData, Ref), Interceptors = case orber_tb:keysearch(interceptors, Options, orber_env:get_interceptors()) of {native, PIs} -> {native, orber_pi:new_in_connection(PIs, Address, Port, LAddress, LPort), PIs}; Other -> Other end, Env = case ?ORB_FLAG_TEST(Flags, ?ORB_ENV_LOCAL_INTERFACE) of true when Type == ssl -> #giop_env{interceptors = Interceptors, flags = Flags, host = [LAddress], iiop_port = orber_tb:keysearch(iiop_port, Options, orber_env:iiop_port()), iiop_ssl_port = LPort, domain = orber:domain(), partial_security = orber:partial_security()}; true -> #giop_env{interceptors = Interceptors, flags = Flags, host = [LAddress], iiop_port = LPort, iiop_ssl_port = orber_tb:keysearch(iiop_ssl_port, Options, orber_env:iiop_ssl_port()), domain = orber:domain(), partial_security = orber:partial_security()}; false -> case ?ORB_FLAG_TEST(Flags, ?ORB_ENV_ENABLE_NAT) of false -> #giop_env{interceptors = Interceptors, flags = Flags, host = orber:host(), iiop_port = orber:iiop_port(), iiop_ssl_port = orber:iiop_ssl_port(), domain = orber:domain(), partial_security = orber:partial_security()}; true -> #giop_env{interceptors = Interceptors, flags = Flags, host = orber_tb:keysearch(nat_ip_address, Options, orber_env:nat_host()), iiop_port = orber_tb:keysearch(nat_iiop_port, Options, orber_env:nat_iiop_port()), iiop_ssl_port = orber_tb:keysearch(nat_iiop_ssl_port, Options, orber_env:nat_iiop_ssl_port()), domain = orber:domain(), partial_security = orber:partial_security()} end end, Timeout = orber_tb:keysearch(iiop_in_connection_timeout, Options, orber_env:iiop_in_connection_timeout()), MaxFrags = orber_tb:keysearch(iiop_max_fragments, Options, orber_env:iiop_max_fragments()), MaxRequests = orber_tb:keysearch(iiop_max_in_requests, Options, orber_env:iiop_max_in_requests()), {ok, #state{stype = Type, socket = Socket, db = ets:new(orber_incoming_requests, [set]), timeout = Timeout, max_fragments = MaxFrags, max_requests = MaxRequests, giop_env = Env, peer = PeerData}, Timeout} end.%%-----------------------------------------------------------------%% Func: terminate/2%%-----------------------------------------------------------------%% We may want to kill all proxies before terminating, but the best%% option should be to let the requests complete (especially for one-way%% functions it's a better alternative.terminate(_Reason, #state{db = IncRequests, giop_env = Env}) -> ets:delete(IncRequests), case Env#giop_env.interceptors of false -> ok; {native, Ref, PIs} -> orber_pi:closed_in_connection(PIs, Ref); {_Type, _PIs} -> ok end.%%-----------------------------------------------------------------%% Func: handle_call/3%%-----------------------------------------------------------------handle_call(stop, _From, State) -> {stop, normal, ok, State};handle_call(_, _, State) -> {noreply, State, State#state.timeout}.%%-----------------------------------------------------------------%% Func: handle_cast/2%%-----------------------------------------------------------------handle_cast({post_accept, Type, Socket}, State) ->
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?