erlang网络库
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

80 lines
2.0 KiB

преди 3 години
преди 5 години
преди 3 години
преди 5 години
преди 3 години
преди 5 години
преди 3 години
преди 5 години
преди 3 години
преди 5 години
преди 3 години
преди 3 години
преди 5 години
преди 3 години
преди 3 години
преди 5 години
преди 3 години
преди 5 години
преди 3 години
преди 5 години
преди 3 години
преди 5 години
преди 3 години
преди 5 години
преди 3 години
преди 5 години
преди 3 години
преди 5 години
преди 3 години
преди 5 години
преди 3 години
преди 5 години
преди 3 години
преди 5 години
преди 3 години
преди 5 години
преди 3 години
преди 3 години
преди 5 години
преди 3 години
преди 5 години
преди 3 години
преди 5 години
  1. -module(utTcpAFSrv). %% tcp active false server
  2. -behaviour(gen_server).
  3. -include("eNet.hrl").
  4. %% start
  5. -export([newConn/2]).
  6. -export([start/2, start_link/1]).
  7. %% gen_server Function Exports
  8. -export([init/1
  9. , handle_call/3
  10. , handle_cast/2
  11. , handle_info/2
  12. , terminate/2
  13. , code_change/3
  14. ]).
  15. -record(state, {transport, socket}).
  16. start(Name, Port) ->
  17. TcpOpts = [binary, {reuseaddr, true}],
  18. Opts = [{tcpOpts, TcpOpts}, {conMod, ?MODULE}],
  19. eNet:openTcp(Name, Port, Opts).
  20. start_link(Sock) ->
  21. {ok, proc_lib:spawn_link(?MODULE, init, [Sock])}.
  22. newConn(Sock, _) ->
  23. start_link(Sock).
  24. init(_Sock) ->
  25. gen_server:enter_loop(?MODULE, [], #state{}).
  26. handle_call(_Request, _From, State) ->
  27. io:format("handle_call for______ ~p~n", [_Request]),
  28. {reply, ignore, State}.
  29. handle_cast(_Msg, State) ->
  30. io:format("handle_cast for______ ~p~n", [_Msg]),
  31. {noreply, State}.
  32. handle_info({inet_async, Sock, _Ref, {ok, Data}}, State = #state{socket = _Sock}) ->
  33. {ok, Peername} = inet:peername(Sock),
  34. io:format("packet:~p Data from ~p: ~s~n", [inet:getopts(Sock, [packet]), Peername, Data]),
  35. prim_inet:send(Sock, Data),
  36. prim_inet:async_recv(Sock, 0, -1),
  37. {noreply, State};
  38. handle_info({inet_async, _Sock, _Ref, {error, Reason}}, State) ->
  39. io:format("Shutdown for ~p~n", [Reason]),
  40. shutdown(Reason, State);
  41. handle_info({inet_reply, _Sock, ok}, State) ->
  42. io:format("inet_reply for______ ~p~n", [ok]),
  43. {noreply, State};
  44. handle_info({inet_reply, _Sock, {error, Reason}}, State) ->
  45. io:format("Shutdown for ~p~n", [Reason]),
  46. shutdown(Reason, State);
  47. handle_info({?mSockReady, Sock}, State) ->
  48. prim_inet:async_recv(Sock, 0, -1),
  49. io:format("get miSockReady for______ ~p~n", [Sock]),
  50. {noreply, State};
  51. handle_info(_Info, State) ->
  52. io:format("handle_info for______ ~p~n", [_Info]),
  53. {noreply, State}.
  54. terminate(_Reason, #state{socket = Sock}) ->
  55. catch gen_tcp:close(Sock).
  56. code_change(_OldVsn, State, _Extra) ->
  57. {ok, State}.
  58. shutdown(Reason, State) ->
  59. {stop, {shutdown, Reason}, State}.