net

gen_tcp模块:

主要的选项:
option() = {active, true | false }
         | {buffer, integer() >= 0}
         | {delay_send, boolean()}
         | {deliver, port | term}
         | {exit_on_close, boolean()}
         | {header, integer() >= 0}
         | {keepalive, boolean()}
         | {mode, list | binary}
         | list
         | binary
         | {nodelay, boolean()}
         | {packet,
            0 |
            1 |
            2 |
            4 |
         | {packet_size, integer() >= 0}
         | {raw,
            Protocol :: integer() >= 0,
            OptionNum :: integer() >= 0,
            ValueBin :: binary()}
         | {recbuf, integer() >= 0}
         | {reuseaddr, boolean()}
         | {send_timeout, integer() >= 0 | infinity}
         | {send_timeout_close, boolean()}
         | {sndbuf, integer() >= 0}

连接:
connect(Address, Port, Options) -> {ok, Socket} | {error, Reason}
connect(Address, Port, Options, Timeout) -> {ok, Socket} | {error, Reason}
{ok, Sock} = gen_tcp:connect("localhost", 5678, [binary, {packet, 0}]),

监听端口:
listen(Port, Options) -> {ok, ListenSocket} | {error, Reason}
{ok, LSock} = gen_tcp:listen(5678, [binary, {packet, 0},  {active, false}]),

接受连接(阻塞):
accept(ListenSocket) -> {ok, Socket} | {error, Reason}
accept(ListenSocket, Timeout) -> {ok, Socket} | {error, Reason}


发送:
send(Socket, Packet) -> ok | {error, Reason}

主动接收 (阻塞, 前提 {active, true}):
recv(Socket, Length) -> {ok, Packet} | {error, Reason}
recv(Socket, Length, Timeout) -> {ok, Packet} | {error, Reason}

The Length argument is only meaningful when the socket is in raw mode and denotes the number of bytes to read. If Length = 0, all available bytes are returned. .

当{active,false}时, 数据以 {tcp, Socket, Data} 带外消息传递给socket的控制进程.

更改socket的控制进程:
controlling_process(Socket, Pid) -> ok | {error, Reason}

调用gen_tcp:accept或gen_tcp:connect的进程 是socket的原始控制进程,该套接字所收到的任何消息都会转发给这个控制进程,如果控制进程消亡,那么该套接字也会自行关闭。

关闭socket:
close(Socket) -> ok
shutdown(Socket, How) -> ok | {error, Reason}
   How = read | write | read_write
Immediately close a socket in one or two directions.
the {exit_on_close, false} option is useful.


处理socket的选项 inet模块
inet:setopts(Socket, Options) -> ok | {error, posix()}

prim_inet:async_accept和prim_inet:async_recv是非阻塞的实现方案,可参看Rabbitmq的源码。

猜你喜欢

转载自catdoc.iteye.com/blog/2110470
net