> Erlang中文手册 > accept/2 接受一个发送到监听套接字 ListenSocket 上的连接请求

gen_tcp:accept/2

接受一个发送到监听套接字 ListenSocket 上的连接请求

用法:

accept(ListenSocket, Timeout) -> {ok, Socket} | {error, Reason}

接受一个发送到监听套接字 ListenSocket 上的连接请求。ListenSocket 必须是由函数 gen_tcp:listen/2 建立返回。Timeout 是一个毫秒级的超时值,默认为infinity。

该函数会引起进程阻塞,直到有一个连接请求发送到监听的套接字,或是超过监听接受时间。

如果连接已建立,则返回 {ok,Socket};或如果 ListenSocket 已经关闭,则返回{error,closed};或如果在指定的时间内连接没有建立,则返回{error,timeout};或如果 Erlang 虚拟机里可用的端口都被使用了,则返回 {error, system_limit};如果某些东西出错,也可能返回一个 POSIX 错误。一些有可能的错误请查看 inet 模块的相关说明。

使用 gen_tcp:send/2 向该函数返回的套接字 Socket 发送数据包。往端口发送的数据包会以下面格式的消息发送:

{tcp, Socket, Data}

如果在建立套接字 Socket 的时候选项列表中指定了 {active,false},这样就只能使用 gen_tcp:recv/2 或 gen_tcp:recv/3 来接收数据包了。

{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, 1500) of
            {ok, Socket} ->
                Socket;
            {error, SocketAcceptFail} ->
                SocketAcceptFail
        end;
    _ ->
        socket_listen_fail
end.