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.
merci Correcte, mais comment vais-je convertir les données de retour aux valeurs d'origine? – user2484294
@ 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
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 >>' –