我的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?
答案 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}.