4

我的 init() 函数创建 UDP Socket 并将 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?

4

2 回答 2

6

您需要通过gen_server:call对新创建的 gen_server 进程进行 a 来获取套接字。例如:

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
于 2012-09-04T21:50:24.243 回答
1

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

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}.
于 2012-09-05T05:37:34.043 回答