erlang TCP/IP

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).

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值