套接字
Sockets.Sockets
— 模块Sockets.connect
— 方法connect([host], port::Integer) -> TCPSocket
连接到主机 host
上的端口 port
。
Sockets.connect
— 方法connect(path::AbstractString) -> PipeEndpoint
连接到 path
指定的命名管道/UNIX 域套接字。
Unix 上的路径长度限制在 92 到 108 字节之间(参见 man unix
)。
Sockets.listen
— 方法listen([addr, ]port::Integer; backlog::Integer=BACKLOG_DEFAULT) -> TCPServer
侦听 addr
指定的地址上的端口。默认情况下,这仅侦听 localhost
。要侦听所有接口,请根据需要传递 IPv4(0)
或 IPv6(0)
。backlog
决定在服务器开始拒绝连接之前,可以有多少个连接处于挂起状态(未调用 accept
)。backlog
的默认值为 511。
Sockets.listen
— 方法listen(path::AbstractString) -> PipeServer
创建并侦听命名管道/UNIX 域套接字。
Unix 上的路径长度限制在 92 到 108 字节之间(参见 man unix
)。
Sockets.getaddrinfo
— 函数getaddrinfo(host::AbstractString, IPAddr=IPv4) -> IPAddr
获取指定 IPAddr
类型的 host
的第一个 IP 地址。使用操作系统的底层 getaddrinfo 实现,这可能会执行 DNS 查询。
Sockets.getipaddr
— 函数getipaddr() -> IPAddr
获取本地机器的 IP 地址,优先使用 IPv4 而不是 IPv6。如果没有任何地址可用,则抛出异常。
getipaddr(addr_type::Type{T}) where T<:IPAddr -> T
获取指定类型的本地机器的 IP 地址。如果没有任何指定类型的地址可用,则抛出异常。
此函数是围绕 getipaddrs
的向后兼容包装器。新的应用程序应改用 getipaddrs
。
示例
julia> getipaddr()
ip"192.168.1.28"
julia> getipaddr(IPv6)
ip"fe80::9731:35af:e1c5:6e49"
另请参阅 getipaddrs
。
Sockets.getipaddrs
— 函数getipaddrs(addr_type::Type{T}=IPAddr; loopback::Bool=false) where T<:IPAddr -> Vector{T}
获取本地机器的 IP 地址。
将可选的 addr_type
参数设置为 IPv4
或 IPv6
将导致仅返回该类型的地址。
loopback
关键字参数决定是否包含环回地址(例如 ip"127.0.0.1"
、ip"::1"
)。
此函数从 Julia 1.2 开始可用。
示例
julia> getipaddrs()
5-element Array{IPAddr,1}:
ip"198.51.100.17"
ip"203.0.113.2"
ip"2001:db8:8:4:445e:5fff:fe5d:5500"
ip"2001:db8:8:4:c164:402e:7e3c:3668"
ip"fe80::445e:5fff:fe5d:5500"
julia> getipaddrs(IPv6)
3-element Array{IPv6,1}:
ip"2001:db8:8:4:445e:5fff:fe5d:5500"
ip"2001:db8:8:4:c164:402e:7e3c:3668"
ip"fe80::445e:5fff:fe5d:5500"
另请参阅 islinklocaladdr
。
Sockets.islinklocaladdr
— 函数islinklocaladdr(addr::IPAddr)
测试 IP 地址是否为链路本地地址。链路本地地址不能保证在其网络段之外唯一,因此路由器不转发它们。链路本地地址来自地址块 169.254.0.0/16
或 fe80::/10
。
示例
filter(!islinklocaladdr, getipaddrs())
Sockets.getalladdrinfo
— 函数getalladdrinfo(host::AbstractString) -> Vector{IPAddr}
获取 host
的所有 IP 地址。使用操作系统的底层 getaddrinfo
实现,这可能会执行 DNS 查询。
示例
julia> getalladdrinfo("google.com")
2-element Array{IPAddr,1}:
ip"172.217.6.174"
ip"2607:f8b0:4000:804::200e"
Sockets.DNSError
— 类型DNSError
在 DNS 查询中发生错误时抛出的异常类型。host
字段指示主机 URL 字符串。code
字段指示基于 libuv 的错误代码。
Sockets.getnameinfo
— 函数getnameinfo(host::IPAddr) -> String
对 IP 地址执行反向查找以返回主机名和服务,使用操作系统的底层 getnameinfo
实现。
示例
julia> getnameinfo(IPv4("8.8.8.8"))
"google-public-dns-a.google.com"
Sockets.getsockname
— 函数getsockname(sock::Union{TCPServer, TCPSocket}) -> (IPAddr, UInt16)
获取给定套接字绑定的 IP 地址和端口。
Sockets.getpeername
— 函数getpeername(sock::TCPSocket) -> (IPAddr, UInt16)
获取给定套接字连接到的远程端点的 IP 地址和端口。仅对已连接的 TCP 套接字有效。
Sockets.IPAddr
— 类型Sockets.IPv4
— 类型IPv4(host::Integer) -> IPv4
从格式化为 Integer
的 IP 地址 host
返回 IPv4 对象。
示例
julia> IPv4(3223256218)
ip"192.30.252.154"
Sockets.IPv6
— 类型IPv6(host::Integer) -> IPv6
从格式化为 Integer
的 IP 地址 host
返回 IPv6 对象。
示例
julia> IPv6(3223256218)
ip"::c01e:fc9a"
Sockets.@ip_str
— 宏@ip_str str -> IPAddr
将 str
解析为 IP 地址。
示例
julia> ip"127.0.0.1"
ip"127.0.0.1"
julia> @ip_str "2001:db8:0:0:0:0:2:1"
ip"2001:db8::2:1"
Sockets.TCPSocket
— 类型TCPSocket(; delay=true)
使用 libuv 打开 TCP 套接字。如果 delay
为真,则 libuv 会延迟创建套接字的文件描述符,直到第一个 bind
调用。TCPSocket
具有各种字段来表示套接字的状态以及它的发送/接收缓冲区。
Sockets.UDPSocket
— 类型UDPSocket()
使用 libuv 打开 UDP 套接字。UDPSocket
具有各种字段来表示套接字的状态。
Sockets.accept
— 函数accept(server[, client])
接受给定服务器上的连接并返回与客户端的连接。可以提供一个未初始化的客户端流,在这种情况下,它将被使用而不是创建一个新的流。
Sockets.listenany
— 函数listenany([host::IPAddr,] port_hint; backlog::Integer=BACKLOG_DEFAULT) -> (UInt16, TCPServer)
在任何端口上创建一个 TCPServer
,使用 hint 作为起点。返回服务器创建的实际端口和服务器本身的元组。backlog 参数定义 sockfd 的挂起连接队列可以增长的最大长度。
Base.bind
— 函数bind(socket::Union{TCPServer, UDPSocket, TCPSocket}, host::IPAddr, port::Integer; ipv6only=false, reuseaddr=false, kws...)
将 socket
绑定到给定的 host:port
。请注意,0.0.0.0
将侦听所有设备。
ipv6only
参数禁用双栈模式。如果ipv6only=true
,则仅创建 IPv6 堆栈。- 如果
reuseaddr=true
,则多个线程或进程可以绑定到同一个地址而不会出错,如果它们都设置了reuseaddr=true
,但只有最后一个绑定将接收任何流量。
bind(chnl::Channel, task::Task)
将chnl
的生命周期与一个任务关联。当任务终止时,Channel
chnl
会自动关闭。任务中的任何未捕获异常都会传播到chnl
上的所有等待者。
可以显式关闭chnl
对象,独立于任务终止。终止任务对已关闭的Channel
对象没有影响。
当一个通道绑定到多个任务时,第一个终止的任务将关闭该通道。当多个通道绑定到同一个任务时,任务的终止将关闭所有绑定的通道。
示例
julia> c = Channel(0);
julia> task = @async foreach(i->put!(c, i), 1:4);
julia> bind(c,task);
julia> for i in c
@show i
end;
i = 1
i = 2
i = 3
i = 4
julia> isopen(c)
false
julia> c = Channel(0);
julia> task = @async (put!(c, 1); error("foo"));
julia> bind(c, task);
julia> take!(c)
1
julia> put!(c, 1);
ERROR: TaskFailedException
Stacktrace:
[...]
nested task error: foo
[...]
Sockets.send
— 函数send(socket::UDPSocket, host::IPAddr, port::Integer, msg)
通过socket
将msg
发送到host:port
。
Sockets.recv
— 函数recv(socket::UDPSocket)
从指定的套接字读取一个UDP数据包,并返回接收到的字节。此调用会阻塞。
Sockets.recvfrom
— 函数recvfrom(socket::UDPSocket) -> (host_port, data)
从指定的套接字读取一个UDP数据包,返回一个(host_port, data)
元组,其中host_port
将是InetAddr{IPv4}
或InetAddr{IPv6}
,具体取决于情况。
在 Julia 1.3 版本之前,第一个返回值是地址 (IPAddr
)。在 1.3 版本中,它被更改为InetAddr
。
Sockets.setopt
— 函数setopt(sock::UDPSocket; multicast_loop=nothing, multicast_ttl=nothing, enable_broadcast=nothing, ttl=nothing)
设置 UDP 套接字选项。
multicast_loop
:多播数据包的环回(默认值:true
)。multicast_ttl
:多播数据包的 TTL(默认值:nothing
)。enable_broadcast
:如果套接字将用于广播消息,则必须将标志设置为true
,否则 UDP 系统将返回访问错误(默认值:false
)。ttl
:套接字上发送的数据包的生存时间(默认值:nothing
)。
Sockets.nagle
— 函数nagle(socket::Union{TCPServer, TCPSocket}, enable::Bool)
在给定的 TCP 服务器或套接字上启用或禁用 Nagle 算法。
此函数需要 Julia 1.3 或更高版本。
Sockets.quickack
— 函数quickack(socket::Union{TCPServer, TCPSocket}, enable::Bool)
在 Linux 系统上,在socket
上禁用或启用 TCP_QUICKACK。