2012-10-29 19 views
5

सॉकेट के लिए टाइमआउट कैसे सेट करें, मुझे इसे सॉकेट विकल्प मैन में नहीं मिला।
समस्या का पहला समाधान कथन के बाद रखना है।एरलांग सॉकेट और टाइमआउट

{ok, Listen} = gen_tcp:listen(Port, [..,{active, once}...]), 
{ok, Socket} = gen_tcp:accept(Listen), 
loop(Socket). 
loop(Socket) -> 
    receive 
    {tcp, Socket, Data} -> 
     inet:setopts(Sock, [{active, once}]), 
     loop(Socket); 
    {tcp_closed, Socket} -> closed; 
    Other -> process_data(Other) 
    after 1000 -> time_out 
    end. 

लेकिन सॉकेट का समय-समाप्त नहीं हो सकता, क्योंकि वहाँ अन्य प्रक्रियाओं से संदेश मैं कैसे अन्य प्रक्रिया को उत्पन्न करने के बिना समय समाप्ति सेट कर सकते हैं कर रहे हैं?

उत्तर

7

यदि आप सक्रिय मोड का उपयोग कर रहे हैं तो आप एक प्राप्त टाइमआउट निर्दिष्ट नहीं कर सकते हैं। यदि आपको टाइमआउट व्यवहार प्राप्त करने पर नियंत्रण करने की आवश्यकता है, तो सॉकेट विकल्पों पर निष्क्रिय मोड पर स्विच करें, यानी {active,false} सॉकेट विकल्पों पर स्विच करें, और उसके बाद gen_tcp:recv का उपयोग टाइमआउट विकल्प प्राप्त करें।

इसके अलावा, बहुत सारे एरलांग सॉकेट सर्वर डिज़ाइन प्रति क्लाइंट कनेक्शन में एक एरलांग प्रक्रिया का उपयोग करते हैं। उदाहरण के लिए आप http://www.trapexit.org/Building_a_Non-blocking_TCP_server_using_OTP_principles और http://20bits.com/article/erlang-a-generalized-tcp-server देख सकते हैं। ओटीपी Erlang के साथ मजबूत सर्वर बनाने के लिए बहुत बढ़िया तरीके प्रदान करता है; इस का लाभ ले!

0

भी आप उपयोग कर सकते prim_inet: async_recv/3 जो विभिन्न प्रक्रियाओं से अन्य संदेशों receving जब तुम समय समाप्ति के साथ टीसीपी संदेश प्राप्त करने की अनुमति

read(Socket) -> 
prim_inet:async_recv(Socket, 0, 1000), 
receive 
    {inet_async, _ ,_ ,{ok, Msg}} -> 
     io:format("message received ~p~n",[Msg]), 
     read(Socket); 
    {inet_async,_,_,{error,timeout}} -> 
     io:format("timeout !"), 
     catch gen_tcp:close(Socket); 
    {fake, Msg} -> io:format("Message = ~p~n", [Msg]), 
        read(Socket) 
end.