Sockets

Sockets.connectMethod
connect([host], port::Integer) -> TCPSocket

连接到主机 host 的端口 port

source
Sockets.connectMethod
connect(path::AbstractString) -> PipeEndpoint

连接到 path 处的命名管道 / UNIX 域套接字。

Note

在 Unix 上,路径长度限制在 92 到 108 字节之间(参见 man unix)。

source
Sockets.listenMethod
listen([addr, ]port::Integer; backlog::Integer=BACKLOG_DEFAULT) -> TCPServer

在由 addr 指定的地址上监听端口。默认情况下,这仅在 localhost 上监听。要在所有接口上监听,请根据需要传递 IPv4(0)IPv6(0)backlog 决定在服务器开始拒绝连接之前可以有多少个待处理连接(尚未调用 accept)。backlog 的默认值为 511。

source
Sockets.listenMethod
listen(path::AbstractString) -> PipeServer

创建并监听一个命名管道 / UNIX 域套接字。

Note

在 Unix 上,路径长度限制在 92 到 108 字节之间(参见 man unix)。

source
Sockets.getaddrinfoFunction
getaddrinfo(host::AbstractString, IPAddr) -> IPAddr

获取指定 IPAddr 类型的 host 的第一个 IP 地址。使用操作系统底层的 getaddrinfo 实现,可能会进行 DNS 查找。

示例

julia> getaddrinfo("localhost", IPv6)
ip"::1"

julia> getaddrinfo("localhost", IPv4)
ip"127.0.0.1"
source
getaddrinfo(host::AbstractString) -> IPAddr

获取 host 的第一个可用 IP 地址,该地址可以是 IPv4IPv6 地址。使用操作系统底层的 getaddrinfo 实现,该实现可能会进行 DNS 查找。

source
Sockets.getipaddrFunction
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.

source
Sockets.getipaddrsFunction
getipaddrs(addr_type::Type{T}=IPAddr; loopback::Bool=false) where T<:IPAddr -> Vector{T}

获取本地机器的 IP 地址。

将可选的 addr_type 参数设置为 IPv4IPv6 会导致仅返回该类型的地址。

loopback 关键字参数决定是否包含回环地址(例如 ip"127.0.0.1"ip"::1")。

Julia 1.2

此函数自 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.

source
Sockets.islinklocaladdrFunction
islinklocaladdr(addr::IPAddr)

测试一个IP地址是否是链路本地地址。链路本地地址不保证在其网络段之外是唯一的,因此路由器不会转发它们。链路本地地址来自地址块 169.254.0.0/16fe80::/10

示例

filter(!islinklocaladdr, getipaddrs())
source
Sockets.getalladdrinfoFunction
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"
source
Sockets.DNSErrorType
DNSError

当DNS查找发生错误时抛出的异常类型。host字段指示主机URL字符串。code字段指示基于libuv的错误代码。

source
Sockets.getnameinfoFunction
getnameinfo(host::IPAddr) -> String

执行IP地址的反向查找,以使用操作系统的底层getnameinfo实现返回主机名和服务。

示例

julia> getnameinfo(IPv4("8.8.8.8"))
"google-public-dns-a.google.com"
source
Sockets.getsocknameFunction
getsockname(sock::Union{TCPServer, TCPSocket}) -> (IPAddr, UInt16)

获取给定套接字绑定的IP地址和端口。

source
Sockets.getpeernameFunction
getpeername(sock::TCPSocket) -> (IPAddr, UInt16)

获取给定套接字连接的远程端点的IP地址和端口。仅对已连接的TCP套接字有效。

source
Sockets.IPv4Type
IPv4(host::Integer) -> IPv4

从格式为Integer的IP地址host返回一个IPv4对象。

示例

julia> IPv4(3223256218)
ip"192.30.252.154"
source
IPv4(str::AbstractString) -> IPv4

将IPv4地址字符串解析为IPv4对象。

示例

julia> IPv4("127.0.0.1")
ip"127.0.0.1"
source
Sockets.IPv6Type
IPv6(host::Integer) -> IPv6

从格式为Integer的IP地址host返回一个IPv6对象。

示例

julia> IPv6(3223256218)
ip"::c01e:fc9a"
source
IPv6(str::AbstractString) -> IPv6

将IPv6地址字符串解析为IPv6对象。

示例

julia> IPv6("::1")
ip"::1"
source
Sockets.@ip_strMacro
@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"
source
Sockets.TCPSocketType
TCPSocket(; delay=true)

使用 libuv 打开一个 TCP 套接字。如果 delay 为真,libuv 会延迟创建套接字的文件描述符,直到第一次 bind 调用。TCPSocket 具有多个字段来表示套接字的状态以及其发送/接收缓冲区。

source
Sockets.UDPSocketType
UDPSocket()

使用 libuv 打开一个 UDP 套接字。UDPSocket 有多个字段来表示套接字的状态。

source
Sockets.acceptFunction
accept(server[, client])

接受在给定服务器上的连接,并返回与客户端的连接。可以提供一个未初始化的客户端流,在这种情况下,将使用它而不是创建一个新的流。

source
Sockets.listenanyFunction
listenany([host::IPAddr,] port_hint; backlog::Integer=BACKLOG_DEFAULT) -> (UInt16, TCPServer)

在任何端口上创建一个 TCPServer,使用提示作为起始点。返回一个元组,包含服务器创建时的实际端口和服务器本身。backlog 参数定义了待处理连接的队列最大长度。

source
Base.bindFunction
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,但只有最后一个绑定的将接收任何流量。
source
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
[...]
source
Sockets.sendFunction
send(socket::UDPSocket, host::IPAddr, port::Integer, msg)

通过 socketmsg 发送到 host:port

source
Sockets.recvFunction
recv(socket::UDPSocket)

从指定的套接字读取一个 UDP 数据包,并返回接收到的字节。此调用会阻塞。

source
Sockets.recvfromFunction
recvfrom(socket::UDPSocket) -> (host_port, data)

从指定的套接字读取一个 UDP 数据包,返回一个元组 (host_port, data),其中 host_port 将是适当的 InetAddr{IPv4} 或 InetAddr{IPv6}。

Julia 1.3

在 Julia 1.3 版本之前,返回的第一个值是一个地址 (IPAddr)。在 1.3 版本中,它被更改为 InetAddr

source
Sockets.setoptFunction
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)。
source
Sockets.nagleFunction
nagle(socket::Union{TCPServer, TCPSocket}, enable::Bool)

纳格尔算法将多个小的 TCP 数据包批量处理成更大的数据包。这可以提高吞吐量,但会恶化延迟。纳格尔算法默认启用。此函数设置给定 TCP 服务器或套接字上是否启用纳格尔算法。相反的选项在其他语言中称为 TCP_NODELAY

Julia 1.3

此函数需要 Julia 1.3 或更高版本。

source
Sockets.quickackFunction
quickack(socket::Union{TCPServer, TCPSocket}, enable::Bool)

在Linux系统上,TCP_QUICKACK在socket上被禁用或启用。

source