我的init()函數創建UDP套接字,並返回套接字值作爲一個國家。二郎:如何獲得來自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()中獲取Socket?
是的,你可以這樣做。但打開一個插座的處理是由默認的控制過程,並且其接收在活動模式下的數據包的過程中,和如果死導致要關閉套接字。在這種情況下,這可能不是你想要的!解決方案是使用函數'gen_udp:controlling_process'將控制權轉移到gen_server。然而,這將打破'start' /'start_link'返回'{ok,Pid}'這是一件壞事的慣例。最好查詢服務器。 – rvirding
你是對的,可能是真的,你不想讓起始過程成爲控制過程,儘管從上下文來看並不清楚。但是,爲什麼使用'gen_udp:controlling_process'會阻止你返回'{ok,Pid}'? – kjw0188
當然,它不會阻止你返回'{ok,Pid}'。我的意思是,在原始問題中,他想從'start'函數返回'{ok,Socket}',**這將破壞約定。 – rvirding