Erlangред рдЯреАрд╕реАрдкреА / рдЖрдИрдкреА рд╕реЙрдХреЗрдЯ рд╕реЗрдЯрд┐рдВрдЧреНрд╕

рд░реВрд╕реА рдореЗрдВ Erlang рдореЗрдВ рдЯреАрд╕реАрдкреА / рдЖрдИрдкреА рд╕реЙрдХреЗрдЯ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЫреЛрдЯрд╛ рдзреЛрдЦрд╛ рдкрддреНрд░ред рд╕рдм рдХреБрдЫ рдпрд╣рд╛рдБ рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:



1) erlang.org/doc/man/gen_tcp.html

2) www.erlang.org/doc/man/inet.html#setopts-2

3) learnyousomeerlang.com/buckets-of-sockets#tcp-and-udp-trotols



рддреБрд░рдВрдд рдПрдХ рдЙрджрд╛рд╣рд░рдг:
... -define(TCP_OPTIONS, [binary, {packet, raw}, {active, false}]). ... {ok,Socket} = gen_tcp:listen(Port, ?TCP_OPTIONS), ...
      
      





рд╕реЙрдХреЗрдЯ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдЕрд▓реНрдкрд╡рд┐рд░рд╛рдо рджреНрд╡рд╛рд░рд╛ рдЕрд▓рдЧ рдХрд┐рдП рдЧрдП рд╕рд░рдгреА (рд╢реАрдЯ) рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рдХреНрд░рдо рдФрд░ рд╕рдВрдЦреНрдпрд╛ рд╕реНрд╡рд╛рдж рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╣реЛрддреА рд╣реИред



рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ (рдореЛрдб) рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдореЛрдб



рдПрдХ рдореЛрдб рдХрд╛ рдЪрдпрди, рд╣рдо рддрдп рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╡реАрдПрдо рдПрд░реНрд▓реИрдВрдЧ рд╣рдореЗрдВ рд╕реЙрдХреЗрдЯ рд╕реЗ рдХреИрд╕реЗ рдЬрд╛рдирдХрд╛рд░реА рджреЗрдЧрд╛:

- binary



- рдмрд╛рдЗрдирд░реА рдбреЗрдЯрд╛ рдХреЗ рд░реВрдк рдореЗрдВ;

- list



- рдПрдХ рд╕реВрдЪреА рдХреЗ рд░реВрдк рдореЗрдВ

рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рд╕реВрдЪрд┐рдпреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдПрд░рд▓рдВрдЧ рдмрд╛рдЗрдирд░реА рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рддреЗрдЬреА рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред



рдЙрджрд╛рд╣рд░рдг

рд╕реЙрдХреЗрдЯ рдХреЛ рддреАрди рдмрд╛рдЗрдЯреНрд╕ рд╕реЗ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рд╣реБрдЖ: 01 02 03
 %%    Msg = <<1,2,3>>, %% ,     Msg %%  <<FirstByte, Tail/binary>> = Msg, %% : %%  Msg  1 %%  Tail  <<2,3>> %%   (list) Msg = [1,2,3], %%  %%  [FirstByte|Tail] = Msg, %%       %% : %%  Msg  1 %%  Tail  [2,3]
      
      







рд╕реЙрдХреЗрдЯ рд╕реЗ рдбреЗрдЯрд╛ рдкрдврд╝рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ (рд╕рдХреНрд░рд┐рдп)



рдпрд╣ рдкреИрд░рд╛рдореАрдЯрд░ рд╕реЙрдХреЗрдЯ рд╕реЗ рдбреЗрдЯрд╛ рдкрдврд╝рдиреЗ рдХреА рд╡рд┐рдзрд┐ рдФрд░ рд╡рд┐рдзрд┐ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИред



{active, false}



рдореЛрдб рдореЗрдВ {active, false}



рд╕реЙрдХреЗрдЯ рддрдерд╛рдХрдерд┐рдд рдирд┐рд╖реНрдХреНрд░рд┐рдп рдореЛрдб рдореЗрдВ рд╕рдВрдЪрд╛рд▓рд┐рдд рд╣реЛрддрд╛ рд╣реИ ред рдпрд╣ рдмрдбрд╝реЗ рдбреЗрдЯрд╛ рд╡реЙрд▓реНрдпреВрдо рдФрд░ рдЙрдЪреНрдЪ рдЧрддрд┐ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд╢рдВрд╕рд┐рдд рд╣реИ; рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЬрд╣рд╛рдВ рдХреНрд▓рд╛рдЗрдВрдЯ рдФрд░ рд╕рд░реНрд╡рд░ рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдиреЗрдЯрд╡рд░реНрдХ рд╕реНрдкреАрдб рд╣реЛрддреА рд╣реИ; рддрд╛рдХрд┐ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕рдВрджреЗрд╢ рдХреЗ рд╕рд╛рде рд╕рд░реНрд╡рд░ рдХреЛ рдмреНрд▓реЙрдХ рди рдХрд░реЗред рдФрд░ рд╕рднреА рдХреНрдпреЛрдВрдХрд┐ tcp / ip рдлреНрд▓реЛ рдХрдВрдЯреНрд░реЛрд▓ (рдореЗрд░реЗ рд▓рд┐рдП рдУрдкрдирд┐рдВрдЧ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрд╕ рдореЛрдб рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред



рд╕реЙрдХреЗрдЯ рд╕реЗ рдбреЗрдЯрд╛ рд╕реАрдзреЗ рдкрдврд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред
 recv(Socket) -> case gen_tcp:recv(Socket, 0) of {ok, RcvdData} -> %% RcvdData -   recv(Sock); {error, closed} -> %%  {error, closed} end.
      
      





{active, true}



рдореЛрдб рдореЗрдВ {active, true}



рд╕реЙрдХреЗрдЯ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрджреЗрд╢ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдкреНрд░рд╡рд╛рд╣ рдирд┐рдпрдВрддреНрд░рдг рдпрд╣рд╛рдВ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдк рдмрдбрд╝реА рдорд╛рддреНрд░рд╛ рдореЗрдВ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкрдХреНрд╖ рдХреЛ рдлреЗрдВрдХ рд╕рдХрддреЗ рд╣реИрдВред



рд╕реЙрдХреЗрдЯ рд╕реЗ рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрджреЗрд╢ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИред
 recv(Socket) -> receive {tcp, Socket, RcvdData} -> %% RcvdData -   recv(Sock); {tcp_closed, Socket} -> {error, closed} end.
      
      





рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдиреЗ рддрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рднреА рдкреНрд░рд╛рдкреНрдд рдкрд░ рд▓рдЯрдХрд╛рдПрдЧреАред рд▓реЗрдХрд┐рди рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рди рдХреЗрд╡рд▓ рд╕реЙрдХреЗрдЯ рд╕реЗ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ, рдмрд▓реНрдХрд┐ рдЕрдиреНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рд╕реЗ рднреА (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдВрджреЗрд╢ рдЬрд┐рд╕реЗ рд╕реЙрдХреЗрдЯ рдХреЛ рднреЗрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ)ред



рд╕реЙрдХреЗрдЯ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдЪрд▓рддреЗ рд╕рдордп рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
 inet:setopts(Socket, [{active, once}]),
      
      





{active, once}



рдореЛрдб рдореЗрдВ {active, once}



рд╕реЙрдХреЗрдЯ рд╕рдХреНрд░рд┐рдп рдореЛрдб рдореЗрдВ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдкрд╣рд▓рд╛ рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдЙрд╕рдХреЗ рдмрд╛рдж, рдпрд╣ рдкреНрд░рд╡рд╛рд╣ рдирд┐рдпрдВрддреНрд░рдг (tcp рдкреНрд░рд╡рд╛рд╣ рдирд┐рдпрдВрддреНрд░рдг) рдХреЗ рд╕рд╛рде рдирд┐рд╖реНрдХреНрд░рд┐рдп рдореЛрдб рдореЗрдВ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдареАрдХ рдпрд╣реА рд╕реНрдерд┐рддрд┐ рд╣реИ рдЬрдм рд╣рдо рд╕рдВрджреЗрд╢реЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЙрдХреЗрдЯ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рдЙрд╕реА рд╕рдордп рд╣рдореЗрдВ рдкреНрд░рд╡рд╛рд╣ рдирд┐рдпрдВрддреНрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рд╣рд░ рдмрд╛рд░ рдЬрдм рд╣рдо рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рд╕реЙрдХреЗрдЯ рдкрд░ active



рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛ред
 recv(Socket) -> inet:setopts(Socket, [{active, once}]), receive {tcp, Socket, RcvdData} -> %% RcvdData -   recv(Sock); {tcp_closed, Socket} -> {error, closed} end.
      
      







once



рдЕрд▓рд╛рд╡рд╛ once



рдЖрдк рдПрдХ рд╕рдВрдЦреНрдпрд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдк рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдЕрдзрд┐рдХ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред



рдкреЛрдЯрд▓реА



рдЗрд╕ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХрдИ рд╡рд┐рдХрд▓реНрдк рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдореИрдВ рдХреЗрд╡рд▓ рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рдФрд░ рдЙрди рд▓реЛрдЧреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реВрдВрдЧрд╛ рдЬреЛ рдХреБрдЫ рд▓реЛрдЧ рдирд╣реАрдВ рд╕рдордЭрддреЗ рд╣реИрдВред



рд╕реЙрдХреЗрдЯ рд╕реЗ рдбреЗрдЯрд╛ рдПрдХ рд╕рдВрд╡реЗрджрдирд╛рд╣реАрди рдзрд╛рд░рд╛ рдХреЗ рд░реВрдк рдореЗрдВ, рдпрд╛ рдХреБрдЫ рдкреИрдХреЗрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред



{packet,0}



рдпрд╛ {packet,raw}



рдореЛрдб рдореЗрдВ {packet,0}



рдбреЗрдЯрд╛ рдХреЛ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдкреИрдХ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред



{packet,1 | 2 | 4}



{packet,1 | 2 | 4}



{packet,1 | 2 | 4}



рдбреЗрдЯрд╛ 1, 2 рдпрд╛ 4 рдмрд╛рдЗрдЯреНрд╕ рдЖрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЬреЛ рд╕рдВрджреЗрд╢ рдХреА рд▓рдВрдмрд╛рдИ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддрд╛ рд╣реИред рд╕рдВрджреЗрд╢ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдП рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж рд╣реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдЖрдПрдЧрд╛ред



{packet,line}



рдореЛрдб рдореЗрдВ {packet,line}



рдбреЗрдЯрд╛ рддрдм рддрдХ рдПрдХрддреНрд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬрдм рддрдХ рдХрд┐ рдПрдХ рд▓рд╛рдЗрди рдлрд╝реАрдб рдЪрд░рд┐рддреНрд░ рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрдм рдПрдХ рд╕рд░реНрд╡рд░ рд▓рд┐рдЦрддрд╛ рд╣реИ рдЬреЛ рдЯрд░реНрдорд┐рдирд▓ рд╕реЗ рдбреЗрдЯрд╛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИред рд╕реЙрдХреЗрдЯ рд╕реЗ рдбреЗрдЯрд╛ рдЕрд▓рдЧ рд╕реЗ рдЕрдХреНрд╖рд░реЛрдВ рдореЗрдВ рдирд╣реАрдВ рдЖрдПрдЧрд╛, рд▓реЗрдХрд┐рди рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВред



рдореИрдВрдиреЗ рдЕрдиреНрдп рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХреАред рдЙрдиреНрд╣реЗрдВ [ 1 ] рдФрд░ [ реи ] рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред



nodelay



{nodelay, true|false}



рдЕрдиреБрд╡рд╛рдж рдХреЗ рдмрд┐рдирд╛ рд╕рдордЭрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдкреНрд░рдХрд╛рд░ рдХреЗ рдмреВрд▓рд┐рдпрди рдХрд╛ рдПрдХ рдореВрд▓реНрдпред



рдмрдлрд░



рдмрдлрд╝рд░реНрд╕ рдХрд╛ рдЖрдХрд╛рд░ рднреА {buffer, Size}



рдорд╛рдзреНрдпрдо рд╕реЗ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, val(buffer) >= max(val(sndbuf),val(recbuf))



ред рдЬрд┐рд╕реЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред



рд╕реЙрдХреЗрдЯ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред



рд╕реЙрдХреЗрдЯ рдорд╛рд╕реНрдЯрд░



рд╕реЙрдХреЗрдЯ рдмрдирд╛рдиреЗ рд╡рд╛рд▓реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЗрд╕рдХреА рдореЗрдЬрдмрд╛рди рд╣реИред рд▓реЗрдХрд┐рди рд╕реЙрдХреЗрдЯ рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рджреВрд╕рд░реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рджрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
 gen_tcp:controlling_process(Socket, ProcessPID)
      
      







рдпрд╣ рд╡рд╣ рд╕рдм рд╣реИ рдЬреЛ рдореИрдВ tcp / ip Erlang рдЪреАрдЯ рд╢реАрдЯ рдкрд░ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред



All Articles