⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 megaco_tcp_accept.erl

📁 OTP是开放电信平台的简称
💻 ERL
字号:
%% ``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$%%%%-----------------------------------------------------------------%% Purpose: Waiting in accept for new connections.%%------------------------------------------------------------------module(megaco_tcp_accept).%%-----------------------------------------------------------------%% Include files%%------------------------------------------------------------------include_lib("megaco/src/tcp/megaco_tcp.hrl").-include_lib("megaco/src/app/megaco_internal.hrl"). -define(d1(F, A), ?d("~p " ++ F, [self()|A])).-define(d2(F),    ?d1(F, [])).%%-----------------------------------------------------------------%% External exports%%------------------------------------------------------------------export([	 start_link/1	]).%%-----------------------------------------------------------------%% Internal exports%%------------------------------------------------------------------export([	 net_accept/4	]).%%-----------------------------------------------------------------%% External interface functions%%-----------------------------------------------------------------%%-----------------------------------------------------------------%% Func: start%% Description: Starts the proces that makes the accept call.%%-----------------------------------------------------------------start_link({TcpRec, SupPid, Listen}) ->    Args = [TcpRec, SupPid, Listen, self()],    Pid  = proc_lib:spawn_link(?MODULE, net_accept, Args),    {ok, Pid}.%%-----------------------------------------------------------------%% Internal Interface Functions%%-----------------------------------------------------------------%%-----------------------------------------------------------------%% Func: net_accept%% Description: Loop function which calls accept and%%              spawns a connection process when there is an initial%%              contact.%%-----------------------------------------------------------------net_accept(TcpRec, SupPid, ListenFd, Parent) ->    do_accept(TcpRec, SupPid, ListenFd),     net_accept(TcpRec, SupPid, ListenFd, Parent).do_accept(Tcp, Sup, Fd) ->    case gen_tcp:accept(Fd) of	{ok, S} ->	    ?d1("do_accept -> accepted: "		"~n   S: ~p", [S]),	    case megaco_tcp:start_connection(Sup, 					     Tcp#megaco_tcp{socket = S}) of		{ok, Pid} ->		    ?d1("do_accept -> connection started"			"~n   Pid: ~p", [Pid]),		    case gen_tcp:controlling_process(S, Pid) of			ok ->			    ?d2("do_accept -> control transferred"),			    ok;			{error, _Reason} ->			    ?d1("do_accept -> "				"failed changing controlling process: "				"n   _Reason: ~p", [_Reason]),			    tcp_clear(S),			    gen_tcp:close(S)			    end;			    		{error, _Reason} ->		    ?d1("do_accept -> failed starting connection: "			"~n   _Reason: ~p", [_Reason]),		    tcp_clear(S),		    gen_tcp:close(S)		    end;	{error, _Reason} ->	    ?d1("do_accept -> accept failed: "		"~n   _Reason: ~p", [_Reason]),	    ok    end.    tcp_clear(Socket) ->    receive        {tcp, Socket, _Data} ->            tcp_clear(Socket);        {tcp_closed, Socket} ->            tcp_clear(Socket);        {tcp_error, Socket} ->            tcp_clear(Socket)    after 0 ->             ok    end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -