2012-10-29 30 views
5

Cách đặt thời gian chờ nhận cho ổ cắm, tôi không thể tìm thấy nó trong bộ phận tùy chọn ổ cắm.
giải pháp đầu tiên của tôi cho vấn đề là đặt sau tuyên bố.Ổ cắm Erlang và nhận thời gian chờ

{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. 

nhưng các ổ cắm có thể không bao giờ thời gian chờ vì có những tin nhắn từ các quá trình khác làm thế nào tôi có thể thiết lập thời gian chờ mà không đẻ trứng quá trình khác?

Trả lời

7

Bạn không thể chỉ định thời gian chờ nhận nếu bạn đang sử dụng chế độ hoạt động. Nếu bạn cần kiểm soát hành vi hết thời gian chờ, hãy chuyển sang chế độ thụ động trên ổ cắm, ví dụ: {active,false} trên tùy chọn ổ cắm và sau đó sử dụng gen_tcp:recv với tùy chọn thời gian chờ nhận.

Ngoài ra, rất nhiều thiết kế máy chủ socket Erlang sử dụng quy trình Erlang cho mỗi kết nối máy khách. Bạn có thể xem các ví dụ http://www.trapexit.org/Building_a_Non-blocking_TCP_server_using_OTP_principleshttp://20bits.com/article/erlang-a-generalized-tcp-server. OTP cung cấp rất nhiều cách tuyệt vời để xây dựng các máy chủ mạnh mẽ với Erlang; tận dụng lợi thế của nó!

0

bạn cũng có thể sử dụng prim_inet: async_recv/3 cho phép bạn nhận được thông báo tcp với thời gian chờ trong khi cập nhật dữ tin nhắn khác từ các quá trình khác nhau

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. 
Các vấn đề liên quan