socktest2.erl 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. -module(socktest2).
  2. -export([
  3. connect/0,
  4. send/1
  5. ]).
  6. -define(SOCKET_PATH, "/tmp/socktest2.sock").
  7. -define(SOCKET_CLIENT_PATH, "/tmp/sockclienttest2.sock").
  8. connect() ->
  9. catch file:delete(?SOCKET_CLIENT_PATH), %% delete old client sock if exists
  10. %case socket:open(local, dgram, udp) of %% Unix domain socket UDP-like
  11. case socket:open(local, dgram, 0) of %% Unix domain socket UDP-like
  12. {ok, Socket} ->
  13. %%io:format("connected to Unix socket (UDP) ~s~n", [SocketPath]),
  14. connect(Socket);
  15. {error, Reason} ->
  16. io:format("connect err: ~p~n", [Reason]),
  17. error
  18. end.
  19. connect(Socket) ->
  20. case socket:bind(Socket, #{family => local, path => ?SOCKET_CLIENT_PATH}) of
  21. ok -> Socket;
  22. {error, Reason} ->
  23. io:format("connect bind err: ~p~n", [Reason]),
  24. error
  25. end.
  26. send(Message) when is_list(Message) orelse is_binary(Message) ->
  27. Socket = connect(),
  28. send(Socket, Message).
  29. send(error, _) -> error;
  30. send(Socket, Message) ->
  31. Msg = unicode:characters_to_binary(Message, utf8),
  32. case socket:sendto(Socket, Msg, #{family => local, path => ?SOCKET_PATH}) of
  33. ok ->
  34. case socket:recv(Socket, 0, 5000) of %% 5 sec timeout
  35. {ok, Reply} ->
  36. %%io:format("received: ~s~n", [Reply]),
  37. socket:close(Socket),
  38. Reply;
  39. E = {error, timeout} ->
  40. io:format("Receive timeout~n", []),
  41. socket:close(Socket),
  42. E;
  43. E = {error, Reason} ->
  44. io:format("receive err: ~p~n", [Reason]),
  45. socket:close(Socket),
  46. E
  47. end;
  48. E = {error, Reason} ->
  49. io:format("send err: ~p~n", [Reason]),
  50. gen_udp:close(Socket),
  51. E
  52. end.