2012-09-04 2 views
4

내 init() 함수는 UDP 소켓을 만들고 소켓 값을 State로 반환합니다.Erlang : gen_server의 init()에서 결과를 얻는 방법

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

%%% gen_server API 

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

내 함수 start()에서 어떻게 소켓을 가져올 수 있습니까?

답변

1

당신이 당신의 스타트 기능 INT UDP를 소켓을해야하는 경우도 스타트 기능에서 그것을 작성하고 그것을 전달할 수 있습니다 링크 호출을 매개 변수로 시작하십시오. 그렇게하면 서버를 만든 후에 서버를 호출 할 필요가 없습니다.

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}. 
+4

네, 그렇게 할 수 있습니다. 그러나 소켓을 여는 프로세스는 기본적으로 제어 프로세스이며 활성 모드에서 패킷을 수신하는 프로세스이며, 소켓이 종료되면 소켓이 닫힙니다. 이 경우에는 아마도 당신이 원하는 것이 아닙니다! 해결책은'gen_udp : controlling_process' 함수를 사용하여 제어를 gen_server에 전달하는 것입니다. 그러나 이것은'start' /'start_link'가 나쁜 것 인'{ok, Pid} '를 반환한다는 관례를 깨뜨릴 것입니다. 서버를 쿼리하는 것이 좋습니다. – rvirding

+0

당신이 맞습니다. 컨텍스트에서 명확하지는 않지만 시작 프로세스를 제어 프로세스로 만들고 싶지는 않을 것입니다. 그러나 왜'gen_udp : controlling_process'를 사용하면'{ok, Pid}'가 반환되지 않을까요? – kjw0188

+0

물론'{ok, Pid}'를 반환하지는 않습니다. 원래의 질문에서'start' 함수에서'{ok, Socket} '을 반환하고 ** this **를 사용하면 규칙을 위반하게된다는 것을 의미했습니다. – rvirding

6

당신은 새로 만든 gen_server 과정에 gen_server:call함으로써 소켓을 가져올 필요가있다. 예 :

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 
관련 문제