Skip to content

Instantly share code, notes, and snippets.

@msantos
Created December 25, 2010 12:17
Show Gist options
  • Select an option

  • Save msantos/754849 to your computer and use it in GitHub Desktop.

Select an option

Save msantos/754849 to your computer and use it in GitHub Desktop.
Erlang Unix stream socket
-module(unix_stream).
-export([client/1, server/0]).
-define(PF_LOCAL, 1).
-define(SOCK_STREAM, 1).
-define(UNIX_PATH_MAX, 108).
-define(BACKLOG, 5).
-define(PATH, <<"/tmp/unix_stream.sock">>).
server() ->
%{ok, Socket} = procket:socket(?PF_LOCAL, ?SOCK_STREAM, 0),
{ok, Socket} = procket:socket(local, stream, 0),
Sun = <<?PF_LOCAL:16/native, % sun_family
?PATH/binary, % address
0:((?UNIX_PATH_MAX-byte_size(?PATH))*8)
>>,
ok = procket:bind(Socket, Sun),
ok = procket:listen(Socket, ?BACKLOG),
accept(Socket).
accept(Socket) ->
case procket:accept(Socket) of
{error, eagain} ->
timer:sleep(10),
accept(Socket);
{ok, FD} ->
spawn(fun() -> echo(FD) end),
accept(Socket)
end.
echo(Socket) ->
case procket:recvfrom(Socket, 16#FFFF) of
{error, eagain} ->
timer:sleep(10),
echo(Socket);
% EOF
{ok, <<>>} ->
io:format("** client disconnected~n");
{ok, Buf} ->
io:format("~p~n", [Buf]),
ok = procket:sendto(Socket, Buf, 0, <<>>),
echo(Socket)
end.
client(Buf) when is_binary(Buf) ->
%{ok, Socket} = procket:socket(?PF_LOCAL, ?SOCK_STREAM, 0),
{ok, Socket} = procket:socket(local, stream, 0),
Sun = <<?PF_LOCAL:16/native, % sun_family
?PATH/binary, % address
0:((?UNIX_PATH_MAX-byte_size(?PATH))*8)
>>,
ok = procket:connect(Socket, Sun),
ok = procket:sendto(Socket, Buf, 0, <<>>),
response(Socket).
response(Socket) ->
case procket:recvfrom(Socket, 16#FFFF) of
{error, eagain} ->
timer:sleep(10),
response(Socket);
{ok, Buf} ->
ok = procket:close(Socket),
io:format("~p~n", [Buf])
end.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment