4

私のinit()関数は、UDPソケットを作成し、ソケット値を状態として返します。

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プロセスを作成して、ソケットをフェッチする必要があります。例えば:

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

start関数にudpソケットが必要な場合は、start関数で作成し、パラメーターとしてstartlink呼び出しに渡すこともできます。そうすれば、作成後にサーバーを呼び出す必要がありません。

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 に答える