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半开的几个小测试 这篇文章。