Comportement tcp_socket incohérent dans Erlang

Afin de lire un caractère à la fois, j’ai écrit un programme qui utilise ssty raw .

J’utilise ce programme character.c pour appeler un fichier erlang, naive_tcp.erl qui envoie un message via socket à un serveur d’écoute situé sur le même ordinateur.

J’attends que ce serveur, naive_tcp2.erl , naive_tcp2.erl avec 26 lignes d’entiers décroissants et une chaîne de 80 caractères avec 2 “|” tuyaux, afin qu’il soit aligné sur le terminal 80×26.

Ce qui se produit à la place est une impression très incohérente des données En ./character.c , puis en appuyant sur une touche du clavier toutes les quelques secondes, vous pouvez voir la sortie commençant par "26" et descendant vers "1" , mais vous pouvez plutôt la voir descendre à "23" , "21" ou seulement "24" .

personnage.c:

 #include #include int main(void){ system ("clear"); int c; /* use system call to make terminal send all keystrokes directly to stdin */ system ("/bin/stty raw"); while((c=getchar())!= '.') { char command[100]; sprintf(command, "erl -noshell -run naive_tcp go -s erlang halt"); system(command); printf("\r\n"); /* type a period to break out of the loop, since CTRL-D won't work raw */ } /* use system call to set terminal behaviour to more normal behaviour */ system ("/bin/stty cooked"); system ("clear"); system ("echo ok\n"); return 0; } 

naive_tcp.erl:

 -module(naive_tcp). -comstack(export_all). go() -> Text = "hello", {ok, Socket} = gen_tcp:connect({127,0,0,1}, 8094, []), send(Socket, Text). format() -> format(26). format(0) -> io:format("\r\n"); format(N) -> io:format(integer_to_list(N)), io:format(" | | "), format(N - 1). send(Socket, Msg) -> inet:setopts(Socket, [{active, once}]), gen_tcp:send(Socket, Msg), receive {tcp, Socket, <>} -> gen_tcp:close(Socket); {tcp, _, Res} -> gen_tcp:close(Socket), io:format(Res ++ "\r\n") end. 

naive_tcp2.erl

 -module(naive_tcp2). -comstack(export_all). go() -> go(8094). go(Port) -> Pid = spawn_link(fun() -> {ok, Listen} = gen_tcp:listen(Port, [binary, {active, false}]), spawn(fun() -> acceptor(Listen) end), timer:sleep(infinity) end), {ok, Pid}. acceptor(ListenSocket) -> {ok, Socket} = gen_tcp:accept(ListenSocket), spawn(fun() -> acceptor(ListenSocket) end), handle(Socket). format(Socket) -> format(26, Socket). format(0, Socket) -> gen_tcp:send(Socket, "\r\n"); format(N, Socket) -> gen_tcp:send(Socket, integer_to_list(N)), gen_tcp:send(Socket, " | | "), format(N - 1, Socket). handle(Socket) -> inet:setopts(Socket, [{active, once}]), receive {tcp, Socket, <>} -> gen_tcp:close(Socket); {tcp, Socket, Bin} -> % gen_tcp:send(Socket, Bin) % Msg = binary:bin_to_list(Bin), format(Socket) end, handle(Socket). 

en cours d’ ./character

 26 | | 25 | | 24 | | 23 | | 26 | | 25 | | 24 | | 23 | | 22 | | 21 26 | | 25 | | 24 | | 23 | | 26 | | 25 | | 24 | | 23 | | 22 | | 21 | | 20 | | 26 | | 25 | | 24 | | 23 | | 22 | | 21 | | 20 26 | | 25 | | 24