> Erlang中文手册 > shutdown/2 半关闭一个套接字

gen_tcp:shutdown/2

半关闭一个套接字

用法:

shutdown(Socket, How) -> ok | {error, Reason}

内部实现:

-spec shutdown(Socket, How) -> ok | {error, Reason} when
      Socket :: socket(),
      How :: read | write | read_write,
      Reason :: inet:posix().

shutdown(S, How) when is_port(S) ->
    case inet_db:lookup_socket(S) of
	{ok, Mod} ->
	    Mod:shutdown(S, How);
	Error ->
	    Error
    end.

以某种方式半关闭一个套接字。

如果参数 How 为 write 的形式,则套接字 socket 会关闭数据写入,读取仍可以正常执行。参数 How 为 read,则反之。

要实现套接字半打开, 那么套接字要设置 {exit_on_close, false} 这个参数。

{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} ->
                inet:setopts(Socket, [{exit_on_close, false}]),
                gen_tcp:shutdown(Socket, write);
            {error, SocketAcceptFail} ->
                SocketAcceptFail
        end;
    _ ->
        socket_listen_fail
end.

套接字详细的相关说明可查看 [Erlang 0097] TCP半开的几个小测试 这篇文章。