gen_tcp:listen/2
开启一个监听某个端口的套接字
listen(Port, Options) -> {ok, ListenSocket} | {error, Reason}
开启一个监听某个端口的套接字,
参数 Port 为 0,那么底层操作系统将赋值一个可用的端口号
参数 Options 的一些常用选项:
- {active, true}:套接字设置为主动模式。所有套接字接收到的消息都作为 Erlang 消息转发到拥有这个套接字进程上。当开启一个套接字时,默认是主动模式。
- {active, false}:设置套接字为被动模式。套接字收到的消息被缓存起来,进程必须通过调用函数 gen_tcp:recv/2 或 gen_tcp:recv/3 来读取这些消息。
- {active, once}:将设置套接字为主动模式,但是一旦收到第一条消息,就将其设置为被动模式,并使用 gen_tcp:recv/2 或 gen_tcp:recv/3 函数来读取后续消息。
gen_tcp:accept/1
gen_tcp:accept/2
接受一个发送到监听套接字 ListenSocket 上的连接请求
accept(ListenSocket) -> {ok, Socket} | {error, Reason}accept(ListenSocket, Timeout) -> {ok, Socket} | {error, Reason}
接受一个发送到监听套接字 ListenSocket 上的连接请求。ListenSocket 是由函数 gen_tcp:listen/2 建立返回的。
Timeout 是一个毫秒级的超时值,默认为infinity。
gen_tcp:close/1
关闭一个 TCP 套接字
close(Socket) -> ok
gen_tcp:connect/3
gen_tcp:connect/4
连接一个 TCP 端口
connect(Address, Port, Options) -> {ok, Socket} | {error, Reason}connect(Address, Port, Options, Timeout) -> {ok, Socket} | {error, Reason}
使用指定的IP地址和端口连接到一个服务器上的 TCP 端口上。参数 Address 即可以是一个主机名,也可以是一个 IP 地址。
参数 Timeout 指定一个以毫秒为单位的超时值,默认值是 infinity。
gen_tcp:controlling_process/2
改变一个套接字的控制进程
controlling_process(Socket, Pid) -> ok | {error, Reason}
为 Socket 分配一个进程 Pid。
gen_tcp:recv/2
gen_tcp:recv/3
从一个被动模式的套接字接受一个数据包
recv(Socket, Length) -> {ok, Packet} | {error, Reason}recv(Socket, Length, Timeout) -> {ok, Packet} | {error, Reason}
这个函数是从一个被动模式的套接字接受一个数据包。
如果 Length = 0,所有有效的字节数据都会被接收。如果 Length > 0,则只会接收 Length 长度的字节,或发生错误;当另一端 Socket 关闭时,接收的数据长度可能会小于 Length。
选项 Timeout 是一个以毫秒为单位的超时值,默认值是 infinity。
gen_tcp:send/2
在一个套接字 Socket 发送一个数据包
send(Socket, Packet) -> ok | {error, Reason}
测试
tcp_test.erl
-module(tcp_test).
-author("chen").
-export([test/0, server/0, client/0
]).
test()->
spawn(tcp_test, server,[]),
spawn(tcp_test, client,[]),
ok.
server() ->
{ok, LSock} = gen_tcp:listen(8000, [binary, {packet, 0}, {active, false}]),
{ok, Sock} = gen_tcp:accept(LSock),
{ok, Bin} = do_recv(Sock, []),
gen_tcp:close(Sock),
io:format("接收到的数据 ~p~n" , [Bin]),
Bin.
do_recv(Sock, Bs) ->
case gen_tcp:recv(Sock, 0) of
{ok, B} ->
do_recv(Sock, [Bs, B]);
{error, closed} ->
{ok, list_to_binary(Bs)}
end.
client() ->
SomeHostInNet = "localhost",
{ok, Sock} = gen_tcp:connect(SomeHostInNet, 8000, [binary, {packet, 0}]),
gen_tcp:send(Sock, "123132"),
gen_tcp:close(Sock).