2013-08-12 1 views
1

J'essaie de recevoir des données via un socket TCP. Quand j'exécute le code ci-dessous, j'obtiens la sortie: localhost^V^A^@, je suis conscient que vous devez convertir les données si vous l'envoyez en binaire, mais puisque j'envoie une liste je pensais qu'elle aurait été reçue la même ? Pourquoi la chaîne Host s'affiche-t-elle correctement mais pas les autres?Réception de données erronées via TCP Erlang

Toute aide serait très appréciée, merci.

cell_process(Port, X, Y)-> 
    Host = "localhost", 
    Data = [Host,Port,X,Y], 
    {ok, Socket} = gen_tcp:connect(Host, 22, 
           [list, {packet, 0}]), 
    ok = gen_tcp:send(Socket, Data), 
    ok = gen_tcp:close(Socket). 


server_process(ClientList)-> 
{ok, Listening_socket} = gen_tcp:listen(22, [list, {packet, 0}, 
             {active, false}]), 
{ok, Socket} = gen_tcp:accept(Listening_socket), 
    case gen_tcp:recv(Socket,0) of 
     {ok,Message}-> 
      io:fwrite(Message); 
     {error,Why}->io:fwrite(Why) 
    end. 

Répondre

2

Data = [Host,Port,X,Y] est un iolist, pas une liste.
gen_tcp: envoyer convertira données à [<<"localhost">>,<<22:8>>]

voici la doc de iolist:

iodata() = iolist() | binary() 
iolist()  maybe_improper_list(char() | binary() | iolist(), binary() | []) 
maybe_improper_list()  maybe_improper_list(any(), any()) 
byte()  0..255 
char()  0..16#10ffffmaybe_improper_list(T)  maybe_improper_list(T, any()) 
+0

merci Correcte, mais comment vais-je convertir les données de retour aux valeurs d'origine? – user2484294

+0

@ user2484294 Appelez 'cell_process' avec des arguments en tant que chaînes ou binaires. Vous pouvez également les convertir dans 'cell_process' mais cela en ferait une fonction plus spécialisée et il semblerait que ce soit général. – rvirding

+0

La clé d'iolist est d'éviter d'aplatir le handle, il suffit de les passer aux fonctions low_level comme 'gen_tcp: send()'. Ici, il vaut mieux envoyer des données '[iolist_size (Host), Host, Post]', et dans le serveur, correspondant comme ceci '<< BinaryLen: 8, Host: BinaryLen/binary, Post: 8 >>' –