Sockets
Sockets.Sockets
— 模組Sockets.connect
— 方法connect([host], port::Integer) -> TCPSocket
連線到埠號為 port
的主機 host
。
Sockets.connect
— 方法connect(path::AbstractString) -> PipeEndpoint
連線到位於 path
的命名管線/UNIX 域 socket。
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)
取得給定 socket 繫結的 IP 位址和埠號。
Sockets.getpeername
— 函式getpeername(sock::TCPSocket) -> (IPAddr, UInt16)
取得給定 socket 連線的遠端端點的 IP 位址和埠號。僅對已連線的 TCP socket 有效。
Sockets.IPAddr
— 類型Sockets.IPv4
— 類型IPv4(host::Integer) -> IPv4
從格式化為 整數
的 IP 位址 host
傳回 IPv4 物件。
範例
julia> IPv4(3223256218)
ip"192.30.252.154"
Sockets.IPv6
— 類型IPv6(host::Integer) -> IPv6
從格式化為 整數
的 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 socket。如果 delay
為 true,libuv 會延遲建立 socket 的檔案描述子,直到第一次 bind
呼叫為止。 TCPSocket
有多個欄位表示 socket 的狀態以及其傳送/接收緩衝區。
Sockets.UDPSocket
— 類型UDPSocket()
使用 libuv 開啟 UDP socket。 UDPSocket
有多個欄位表示 socket 的狀態。
Sockets.accept
— 函式accept(server[, client])
在指定的伺服器上接受連線,並傳回與用戶端的連線。可以提供未初始化的用戶端串流,如此一來,它會用於建立新的串流,而不是使用舊的串流。
Sockets.listenany
— 函式listenany([host::IPAddr,] port_hint; backlog::Integer=BACKLOG_DEFAULT) -> (UInt16, TCPServer)
在任何埠上建立 TCPServer
,使用提示作為起點。傳回伺服器建立所在的實際埠和伺服器本身。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)
從指定的 socket 讀取一個 UDP 封包,並傳回收到的位元組。此呼叫會封鎖。
Sockets.recvfrom
— 函數recvfrom(socket::UDPSocket) -> (host_port, data)
從指定的 socket 讀取一個 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 socket 選項。
multicast_loop
:多播封包的回送 (預設值:true
)。multicast_ttl
:多播封包的 TTL (預設值:nothing
)。enable_broadcast
:如果 socket 將用於廣播訊息,則必須將旗標設定為true
,否則 UDP 系統將回傳存取錯誤 (預設值:false
)。ttl
:在 socket 上傳送封包的存活時間 (預設值:nothing
)。
Sockets.nagle
— 函數nagle(socket::Union{TCPServer, TCPSocket}, enable::Bool)
在指定的 TCP 伺服器或 socket 上啟用或停用 Nagle 演算法。
此函數需要 Julia 1.3 或更新版本。
Sockets.quickack
— 函數quickack(socket::Union{TCPServer, TCPSocket}, enable::Bool)
在 Linux 系統上,TCP_QUICKACK 在 socket
上停用或啟用。