> Erlang中文手册 > recv/3 从一个被动模式的套接字接受一个数据包

gen_tcp:recv/3

从一个被动模式的套接字接受一个数据包

用法:

recv(Socket, Length, Timeout) -> {ok, Packet} | {error, Reason}

这个函数是从一个被动模式的套接字接受一个数据包。如果返回一个 {error, closed} 的返回值,那表明 Socket 已经关闭。

当 Socket 是 raw 模式下,参数 Length 才有意义的,并且 Length 表示接收字节的大小。如果 Length = 0,所有有效的字节数据都会被接收。如果 Length > 0,则只会接收 Length 长度的字节,或发生错误;当另一端 Socket 关闭时,接收的数据长度可能会小于 Length。

选项 Timeout 是一个以毫秒为单位的超时值,默认值是 infinity。

{Rand, _RandSeed} = ranDOM:uniform_s(9999, erlang:now()),
Port = 40000 + Rand,
case gen_tcp:listen(Port, [binary, {packet, 0}, {active, false}]) of
    {ok, ListenSocket} ->
        case gen_tcp:accept(ListenSocket) of
            {ok, Socket} ->
                gen_tcp:recv(Socket, 0, 5000);
            {error, SocketAcceptFail} ->
                SocketAcceptFail
        end;
    _ ->
        socket_listen_fail
end.