Sockets

Sockets.Sockets ── モジュール

ソケットのサポートです。IPAddr とその部分型、および TCPSocket, UDPSocket などを提供します。

Sockets.connect ── メソッド
connect([host], port::Integer) -> TCPSocket

ホスト host のポート port に接続します。

Sockets.connect ── メソッド
connect(path::AbstractString) -> PipeEndpoint

path にある名前付きパイプまたは UNIX ドメインソケットに接続します。

Sockets.listen ── メソッド
listen([addr, ]port::Integer; backlog::Integer=BACKLOG_DEFAULT) -> TCPServer

addr が指定するアドレスのポート port にリッスンします。デフォルトでは localhost だけにリッスンします。全てのインターフェースパスにリッスンするには IPv4(0) または IPv6(0) の適切な方を渡してください。backlog は保留 (accept を呼ばない状態) にできる接続の最大個数を表し、サーバーはそれ以上の接続を拒否します。backlog のデフォルト値は 511 です。

Sockets.listen ── メソッド
listen(path::AbstractString) -> PipeServer

名前付きパイプまたは UNIX ドメインソケットを作成してリッスンします。

Sockets.getaddrinfo ── 関数
getaddrinfo(host::AbstractString, IPAddr=IPv4) -> IPAddr

host の一つ目の IP アドレスを指定した IPAddr 型で取得します。オペレーティングシステムが提供する getaddrinfo 実装を使うので、DNS ルックアップが起こる可能性があります。

Sockets.getipaddr ── 関数
getipaddr() -> IPAddr

ローカルマシンの IP アドレスを一つ取得します。IPv6 より IPv4 を優先します。アドレスが一つも利用可能でなければ例外が送出されます。

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_typeIPv4 または IPv6 に設定すると、その型のアドレスだけが返ります。

キーワード引数 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, split(ENV["SSH_CONNECTION"], ' ')[3] も参照してください。

Sockets.islinklocaladdr ── 関数
islinklocaladdr(addr::IPAddr)

IP アドレス addr がリンクローカルアドレスかどうかを判定します。リンクローカルアドレスはネットワークセグメントをまたいで一意であることが保証されておらず、そのためルーターはフォワードを行いません。リンクローカルアドレスはアドレスブロック 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(Sockets.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 ──
IPAddr

IP アドレスを表す抽象上位型です。IPv4IPv6 を部分型に持ちます。

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"
[email protected]_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 ソケットを開きます。delaytrue だと、libuv はソケットのファイル記述子の作成を bind が最初に呼び出されるまで遅らせます。TCPSocket は送信/受信バッファの他にもソケットの状態を表す様々なフィールドを持ちます。

Sockets.UDPSocket ──
UDPSocket()

libuv を使って UDP ソケットを開きます。UDPSocket はソケットの状態を表す様々なフィールドを持ちます。

Sockets.accept ── 関数
accept(server[, client])

与えられたサーバーで接続を受け付け、クライアントへの接続を返します。未初期化のクライアントストリームを与えることもでき、その場合は新しいストリームを作成せずに与えたストリームを更新して返します。

Sockets.listenany ── 関数
listenany([host::IPAddr,] port_hint) -> (UInt16, TCPServer)

TCPServer を任意のポートで作成します。port_hint は最初に試すポートを表すヒントです。サーバーが実際に作成されたポートとサーバー自身からなるタプルを返します。

Base.bind ── 関数
bind(chnl::Channel, task::Task)

chnl の寿命を task に関連付けます。Channel 型の値 chnltask が終了すると自動的に閉じられるようになります。task 内の未捕捉の例外は chnlwait する全てのタスクに伝播します。

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:
foo
Stacktrace:
[...]
bind(socket::Union{UDPSocket, TCPSocket},
     host::IPAddr,
     port::Integer; ipv6only=false,
     reuseaddr=false,
     kws...)

socket を与えられた host:port にバインドします。0.0.0.0 とすると全てのデバイスにリッスンします。

  • ipv6only = true だとデュアルスタックモードが無効になり、IPv6 スタックだけが作成されます。
  • reuseaddr=true だと、複数のスレッドまたはプロセスが reuseaddr=true として同じアドレスをバインドしたときにエラーが起こらなくなります。ただしトラフィックを受け取るのは最後にバインドしたスレッド/プロセスだけです。
Sockets.send ── 関数
send(socket::UDPSocket, host::IPAddr, port::Integer, msg)

socket を通じて msghost:port に送信します。

Sockets.recv ── 関数
recv(socket::UDPSocket)

指定されたソケットから UDP パケットを読み、受信したバイトを返します。この関数の呼び出しはブロックします。

Sockets.recvfrom ── 関数
recvfrom(socket::UDPSocket) -> (host_port, data)

指定されたソケットから UDP パケットを読み、タプル (host_port, data) を返します。ここで host_portInetAddr{IPv4} または InetAddr{IPv6} から適切な方が選ばれます。

Julia 1.3

Julia 1.3 より前のバージョンでは一つ目の返り値がアドレス (IPAddr) でしたが、Julia 1.3 で InetAddr に変更されました。

Sockets.setopt ── 関数
setopt(sock::UDPSocket;
       multicast_loop=nothing,
       multicast_ttl=nothing,
       enable_broadcast=nothing,
       ttl=nothing)

UDP ソケットのオプションを設定します。

  • multicast_loop: マルチキャストパケットのループバック。
  • multicast_ttl: マルチキャストパケットの TTL。
  • enable_broadcast: ブロードキャストメッセージに使われるソケットで true に設定する必要があるフラグ。設定しないと UDP システムでアクセスエラーが発生する。
  • ttl: ソケットに送られるパケットの TTL。
Sockets.nagle ── 関数
nagle(socket::Union{TCPServer, TCPSocket}, enable::Bool)

与えられた TCP サーバーもしくはソケットで Nagle アルゴリズムを有効化または無効化します。

Sockets.quickack ── 関数
quickack(socket::Union{TCPServer, TCPSocket}, enable::Bool)

socket に対する TCP_QUICKACK を有効化または無効化します。このオプションは Linux システムにのみ存在します。