Sockets Erlang开放式套接字或已知
如何知道使用erlang时套接字是否打开?您所说的是哪种套接字?我的猜测是,如果套接字未打开,大多数套接字函数都会返回错误元组。你说的是什么类型的套接字?我的猜测是,如果套接字未打开,大多数套接字函数都会返回错误元组。使用。如果套接字关闭,则返回未定义的Sockets Erlang开放式套接字或已知,sockets,erlang,Sockets,Erlang,如何知道使用erlang时套接字是否打开?您所说的是哪种套接字?我的猜测是,如果套接字未打开,大多数套接字函数都会返回错误元组。你说的是什么类型的套接字?我的猜测是,如果套接字未打开,大多数套接字函数都会返回错误元组。使用。如果套接字关闭,则返回未定义的。例如: Eshell V5.8.3 (abort with ^G) 1> {ok,S} = gen_tcp:connect("localhost", 8000, [binary,{active,false}]). {ok,#Port} 2>
。例如:
Eshell V5.8.3 (abort with ^G)
1> {ok,S} = gen_tcp:connect("localhost", 8000, [binary,{active,false}]).
{ok,#Port}
2> erlang:port_info(S).
[{name,"tcp_inet"},
{links,[]},
{id,634},
{connected,},
{input,0},
{output,0}]
3> gen_tcp:close(S).
ok
4> erlang:port_info(S).
undefined
Eshell V5.8.3(使用^G中止)
1> {ok,S}=gen_tcp:connect(“localhost”,8000,[binary,{active,false}])。
{好的,#端口}
2> erlang:端口信息。
[{name,“tcp_inet”},
{links,[]},
{id,634},
{已连接,},
{输入,0},
{输出,0}]
3> gen_tcp:关闭。
好啊
4> erlang:端口信息。
未定义
但是要小心使用它进行防御编程,因为这不是Erlang的方式。最好让你的代码假设套接字是打开的,如果它因为试图使用一个已经关闭的套接字而遇到错误,让它崩溃,让其他类似于主管的东西来处理错误。使用。如果套接字关闭,则返回未定义的
。例如:
Eshell V5.8.3 (abort with ^G)
1> {ok,S} = gen_tcp:connect("localhost", 8000, [binary,{active,false}]).
{ok,#Port}
2> erlang:port_info(S).
[{name,"tcp_inet"},
{links,[]},
{id,634},
{connected,},
{input,0},
{output,0}]
3> gen_tcp:close(S).
ok
4> erlang:port_info(S).
undefined
Eshell V5.8.3(使用^G中止)
1> {ok,S}=gen_tcp:connect(“localhost”,8000,[binary,{active,false}])。
{好的,#端口}
2> erlang:端口信息。
[{name,“tcp_inet”},
{links,[]},
{id,634},
{已连接,},
{输入,0},
{输出,0}]
3> gen_tcp:关闭。
好啊
4> erlang:端口信息。
未定义
但是要小心使用它进行防御编程,因为这不是Erlang的方式。最好让你的代码假设套接字是打开的,如果它因为试图使用一个已经关闭的套接字而出现错误,让它崩溃,让其他人(如主管)来处理错误。当你的应用程序到达你想知道的点时,在你的终端中尝试这一点 inet:i() inet:i()
当你的应用程序达到你想知道的点时,在你的终端上试试这个 inet:i() inet:i()
您可能会发现有用的。您可能会发现有用的。这将打开一个客户端套接字,而不是服务器。@rvirding True,但我肯定没有领会你的意思——你可以用调用
gen\u tcp:listen
或gen\u tcp:accept
来代替上面的gen\u tcp:connect
调用,例如,在它们返回的套接字上调用erlang:port\u info/1
,结果与connect示例所示相同。是的,当然会。我的评论只是指出,这段代码是如何打开客户端套接字的一个示例。对于服务器套接字,您需要使用gen_tcp:listen
和gen_tcp:accept
,正如您在评论中所说。这将打开一个客户端套接字,而不是服务器。@rvirding True,但我肯定没有领会你的意思——你可以用调用gen\u tcp:listen
或gen\u tcp:accept
来代替上面的gen\u tcp:connect
调用,例如,在它们返回的套接字上调用erlang:port\u info/1
,结果与connect示例所示相同。是的,当然会。我的评论只是指出,这段代码是如何打开客户端套接字的一个示例。对于服务器套接字,您需要使用gen_tcp:listen
和gen_tcp:accept
,正如您在评论中所说的那样。