gen_udp
gen_udp
模块
gen_udp
模块摘要
接口到UDP套接字。
描述
该模块提供了使用UDP协议与套接字通信的功能。
数据类型
option() =
{active, true | false | once | -32768..32767} |
{add_membership, {
inet:ip_address()
,
inet:ip_address()
}} |
{broadcast, boolean()} |
{buffer, integer() >= 0} |
{deliver, port | term} |
{dontroute, boolean()} |
{drop_membership, {
inet:ip_address()
,
inet:ip_address()
}} |
{header, integer() >= 0} |
{high_msgq_watermark, integer() >= 1} |
{low_msgq_watermark, integer() >= 1} |
{mode, list | binary} |
list |
binary |
{multicast_if,
inet:ip_address()
} |
{multicast_loop, boolean()} |
{multicast_ttl, integer() >= 0} |
{priority, integer() >= 0} |
{raw,
Protocol :: integer() >= 0,
OptionNum :: integer() >= 0,
ValueBin :: binary()} |
{read_packets, integer() >= 0} |
{recbuf, integer() >= 0} |
{reuseaddr, boolean()} |
{sndbuf, integer() >= 0} |
{tos, integer() >= 0} |
{ipv6_v6only, boolean()}
option_name() =
active |
broadcast |
buffer |
deliver |
dontroute |
header |
high_msgq_watermark |
low_msgq_watermark |
mode |
multicast_if |
multicast_loop |
multicast_ttl |
priority |
{raw,
Protocol :: integer() >= 0,
OptionNum :: integer() >= 0,
ValueSpec ::
(ValueSize :: integer() >= 0) | (ValueBin :: binary())} |
read_packets |
recbuf |
reuseaddr |
sndbuf |
tos |
ipv6_v6only
socket()
由open/1,2
返回。
导出方法
close(Socket) -> ok
类型
关闭UDP套接字。
controlling_process(Socket, Pid) -> ok | {error, Reason}
类型
分配一个新的控制过程Pid
来Socket
。控制过程是从套接字接收消息的过程。如果被当前控制进程以外的其他进程调用,{error, not_owner}
则返回。如果标识的进程Pid
不是现有的本地pid,{error, badarg}
则返回。{error, badarg}
在某些情况下,Socket
在执行此功能期间关闭时也可能会返回。
open(Port) -> {ok, Socket} | {error, Reason}
open(Port, Opts) -> {ok, Socket} | {error, Reason}
类型
将UDP端口号(Port
)与调用进程相关联。
可供选择的办法如下:
list
已收到Packet
以列表形式发送。
binary
收到Packet
以二进制形式提供。
{ip, Address}
如果主机有多个网络接口,则此选项指定要使用的接口。
{ifaddr, Address}
同{ip, Address}
如果主机有多个网络接口,则此选项指定要使用的接口。
{fd, integer() >= 0}
如果套接字以某种方式打开而未使用gen_udp
,请使用此选项为其传递文件描述符。如果Port
没有设置0
和/或{ip, ip_address()}
与此选项组合,fd
则在打开后绑定到指定的接口和端口。如果没有指定这些选项,则假定fd
已经适当地绑定。
inet6
设置IPv 6的套接字。
inet
设置IPv 4的套接字。
local
设置Unix域套接字。见inet:local_address()
{udp_module, module()}
覆盖使用哪个回调模块。默认inet_udp
为IPv4和inet6_udp
IPv6。
{multicast_if, Address}
设置多播套接字的本地设备。
{multicast_loop, true | false}
当true
发送的多播数据包循环回到本地套接字时。
{multicast_ttl, Integer}
选项multicast_ttl
更改传出多播数据报的生存时间(TTL),以控制多播的范围。
TTL为1
的数据报不会被转发到本地网络之外。默认为1
。
{add_membership, {MultiAddress, InterfaceAddress}}
加入多播组。
{drop_membership, {MultiAddress, InterfaceAddress}}
留下一个多播组。
Opt
另见inet:setopts/2
。
返回的套接字Socket
用于从此端口发送数据包send/4
。当UDP数据包到达打开的端口时,如果套接字处于活动模式,则将数据包作为消息传递给控制进程:
{udp, Socket, IP, InPortNo, Packet}
如果套接字不处于活动模式,则可以通过recv/2,3
调用检索数据。请注意,比指定接收缓冲区选项长的到达UDP数据包可能会被截断而不会发出警告。
当{active, N}
模式中的套接字(inet:setopts/2
详情参见参考资料)转换到被动{active, false}
模式时,控制进程将通过以下形式的消息得到通知:
{udp_passive, Socket}
IP
和InPortNo
定义来自哪个地址Packet
。Packet
是list
指定选项时的字节列表。Packet
是一个二进制如果binary
指定选项。
接收缓冲区选项的默认值是{recbuf, 8192}
。
如果Port == 0
底层操作系统分配了一个空闲的UDP端口,用inet:port/1
它来检索它。
recv(Socket, Length) ->
{ok, {Address, Port, Packet}} | {error, Reason}
recv(Socket, Length, Timeout) ->
{ok, {Address, Port, Packet}} | {error, Reason}
类型
从被动模式的套接字接收数据包。可选参数Timeout
指定超时(以毫秒为单位)。默认为infinity
。
send(Socket, Address, Port, Packet) -> ok | {error, Reason}
类型
将数据包发送到指定的地址和端口。参数Address
可以是主机名或套接字地址。