gen_udp.erl

来自「OTP是开放电信平台的简称」· ERL 代码 · 共 117 行

ERL
117
字号
%% ``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$%%-module(gen_udp).-export([open/1, open/2, close/1]).-export([send/2, send/4, recv/2, recv/3, connect/3]).-export([controlling_process/2]).-export([fdopen/2]).-include("inet_int.hrl").open(Port) ->     open(Port, []).open(Port, Opts) ->    Mod = mod(Opts),    {ok,UP} = Mod:getserv(Port),    Mod:open(UP, Opts).close(S) ->    inet:udp_close(S).send(S, Address, Port, Packet) when is_port(S) ->    case inet_db:lookup_socket(S) of	{ok, Mod} ->	    case Mod:getaddr(Address) of		{ok,IP} ->		    case Mod:getserv(Port) of			{ok,UP} -> Mod:send(S, IP, UP, Packet);			{error,einval} -> exit(badarg);			Error -> Error		    end;		{error,einval} -> exit(badarg);		Error -> Error	    end;	Error ->	    Error    end.send(S, Packet) when is_port(S) ->    case inet_db:lookup_socket(S) of	{ok, Mod} ->	    Mod:send(S, Packet);	Error ->	    Error    end.recv(S,Len) when is_port(S), is_integer(Len) ->    case inet_db:lookup_socket(S) of	{ok, Mod} ->	    Mod:recv(S, Len);	Error ->	    Error    end.recv(S,Len,Time) when is_port(S) ->    case inet_db:lookup_socket(S) of	{ok, Mod} ->	    Mod:recv(S, Len,Time);	Error ->	    Error    end.connect(S, Address, Port) when is_port(S) ->    case inet_db:lookup_socket(S) of	{ok, Mod} ->	    case Mod:getaddr(Address) of    		{ok, IP} ->		    Mod:connect(S, IP, Port);		Error ->		    Error	    end;	Error ->	    Error    end.controlling_process(S, NewOwner) ->    inet:udp_controlling_process(S, NewOwner).%%%% Create a port/socket from a file descriptor %%fdopen(Fd, Opts) ->    Mod = mod(),    Mod:fdopen(Fd, Opts).%% Get the udp_modulemod() -> inet_db:udp_module().%% Get the udp_module, but option udp_module|inet|inet6 overridesmod([{udp_module,Mod}|_]) ->    Mod;mod([inet|_]) ->    inet_udp;mod([inet6|_]) ->    inet6_udp;mod([_|Opts]) ->    mod(Opts);mod([]) ->    mod().

⌨️ 快捷键说明

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