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