【问题标题】:Receiving wrong data via TCP Erlang通过 TCP Erlang 接收错误数据
【发布时间】:2013-08-14 09:43:07
【问题描述】:

我正在尝试通过 TCP 套接字接收一些数据。当我运行下面的代码时,我得到输出:localhost^V^A^@,我知道如果使用二进制发送数据,您需要转换数据,但由于我发送的是一个列表,我认为它会收到相同的?为什么 Host 字符串显示正确,而其他数据却没有?

任何帮助将不胜感激,谢谢。

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.

【问题讨论】:

    标签: tcp functional-programming erlang


    【解决方案1】:

    Data = [Host,Port,X,Y]是一个iolist,而不是一个列表。
    gen_tcp:send 将数据转换为[<<"localhost">>,<<22:8>>]

    这里是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())
    

    【讨论】:

    • 好的,谢谢,但我如何将数据转换回原始值?
    • @user2484294 调用cell_process,参数为字符串或二进制文件。您也可以将它们转换为cell_process,但这会使其成为更专业的功能,并且看起来应该是通用的。
    • iolist 的关键是避免扁平化句柄,只需将它们传递给低级函数,如gen_tcp:send()。在这里你最好发送数据[iolist_size(Host),Host,Post],并在服务器中,像这样匹配<<BinaryLen:8,Host:BinaryLen/binary,Post:8>>
    猜你喜欢
    • 2012-09-27
    • 1970-01-01
    • 2014-09-06
    • 1970-01-01
    • 2012-03-10
    • 2018-01-25
    • 2015-09-25
    • 2011-09-09
    • 2018-09-17
    相关资源
    最近更新 更多