Erlang:如何从gen_server中的init()获取结果

时间:2012-09-04 20:47:29

标签: erlang gen-server

我的init()函数创建UDP套接字并将Socket值作为状态返回。

start() ->
        {ok, ServerPid} = gen_server:start_link(?MODULE, [], []).

%%% gen_server API

init([]) ->
        {ok, Socket} = gen_udp:open(8888, [list, {active,false}]),
        {ok, Socket}.

如何在函数start()中获取Socket?

2 个答案:

答案 0 :(得分:6)

您需要通过为新创建的gen_server进程创建gen_server:call来获取套接字。 e.g:

start() ->
        {ok, ServerPid} = gen_server:start_link(?MODULE, [], []),
        Socket = gen_server:call(ServerPid, fetch_socket),
        ... Use Socket ...

在gen_server中添加如下内容:

handle_call(fetch_socket, _From, State) ->
   {reply, State, State}. %% State == Socket

答案 1 :(得分:1)

如果你的start函数需要udp socket,你也可以在start函数中创建它,并将它作为参数传递给start link调用。这样,您不必在创建服务器后调用它。

rvirding指出这将导致启动进程从udp套接字而不是新生成的服务器接收消息。有关更多信息,请参阅注释。从问题中不清楚start方法中究竟需要什么样的套接字,但要确保这是你想要的行为。

start() ->
    {ok, Socket} = gen_udp:open(8888, [list, {active,false}]),
    {ok, ServerPid} = gen_server:start_link(?MODULE, Socket, []).

%%% gen_server API

init(Socket) ->
    {ok, Socket}.