github.com/shogo82148/std@v1.22.1-0.20240327122250-4e474527810c/net/dial.go (about) 1 // Copyright 2010 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package net 6 7 import ( 8 "github.com/shogo82148/std/context" 9 "github.com/shogo82148/std/syscall" 10 "github.com/shogo82148/std/time" 11 ) 12 13 // Dialerはアドレスに接続するためのオプションを含んでいます。 14 // 15 // 各フィールドのゼロ値は、そのオプションなしでダイヤルすることと同等です。 16 // Dialerのゼロ値でダイヤルすることは、単に [Dial] 関数を呼び出すのと同等です。 17 // 18 // Dialerのメソッドを同時に呼び出しても安全です。 19 type Dialer struct { 20 21 // Timeoutはダイヤルが接続の完了を待つ最大時間です。Deadlineも設定されている場合、より早く失敗する可能性があります。 22 // デフォルトはタイムアウトなしです。 23 // TCPを使用して複数のIPアドレスを持つホスト名にダイヤルする場合、タイムアウトはそれらの間で分割される場合があります。 24 // タイムアウトの有無にかかわらず、オペレーティングシステムは独自の早期タイムアウトを課す場合があります。たとえば、TCPのタイムアウトは通常約3分です。 25 Timeout time.Duration 26 27 // Deadlineは、ダイヤルが失敗する絶対的な時間です。 28 // Timeoutが設定されている場合、それよりも早く失敗することがあります。 29 // ゼロは期限がないことを意味し、またはオペレーティングシステムに依存することもあります。 30 // (Timeoutオプションと同様に) 31 Deadline time.Time 32 33 // LocalAddr is the local address to use when dialing an 34 // address. The address must be of a compatible type for the 35 // network being dialed. 36 // If nil, a local address is automatically chosen. 37 LocalAddr Addr 38 39 // DualStackは以前からRFC 6555 Fast Fallback、または「Happy Eyeballs」として知られる機能をサポートしており、IPv6が誤設定されていて正しく動作していない場合にはIPv4がすぐに試されます。 40 // 廃止予定:Fast Fallbackはデフォルトで有効になっています。無効にするには、FallbackDelayを負の値に設定してください。 41 DualStack bool 42 43 // FallbackDelayは、RFC 6555 Fast Fallback接続を作成する前に待機する時間の長さを指定します。つまり、IPv6が成功するまで待機する時間であり、IPv6の設定が誤っていると仮定し、IPv4に切り替える前に待機する時間です。 44 // ゼロの場合、デフォルトの遅延時間は300msです。 45 // 負の値はFast Fallbackサポートを無効にします。 46 FallbackDelay time.Duration 47 48 // KeepAlive specifies the interval between keep-alive 49 // probes for an active network connection. 50 // 51 // KeepAlive is ignored if KeepAliveConfig.Enable is true. 52 // 53 // If zero, keep-alive probes are sent with a default value 54 // (currently 15 seconds), if supported by the protocol and operating 55 // system. Network protocols or operating systems that do 56 // not support keep-alive ignore this field. 57 // If negative, keep-alive probes are disabled. 58 KeepAlive time.Duration 59 60 // KeepAliveConfig specifies the keep-alive probe configuration 61 // for an active network connection, when supported by the 62 // protocol and operating system. 63 // 64 // If KeepAliveConfig.Enable is true, keep-alive probes are enabled. 65 // If KeepAliveConfig.Enable is false and KeepAlive is negative, 66 // keep-alive probes are disabled. 67 KeepAliveConfig KeepAliveConfig 68 69 // Resolverはオプションで、代替のリゾルバを指定することができます。 70 Resolver *Resolver 71 72 // Cancel is an optional channel whose closure indicates that 73 // the dial should be canceled. Not all types of dials support 74 // cancellation. 75 // 76 // Deprecated: Use DialContext instead. 77 Cancel <-chan struct{} 78 79 // Controlがnilでない場合、ネットワーク接続の作成後に、実際にダイアルする前に呼び出されます。 80 // 81 // Control関数に渡されるネットワークとアドレスのパラメータは、必ずしもDialに渡されるものとは限りません。たとえば、Dialに「tcp」を渡すと、Control関数は「tcp4」または「tcp6」で呼び出されます。 82 // 83 // ControlContextがnilでない場合、Controlは無視されます。 84 Control func(network, address string, c syscall.RawConn) error 85 86 // ControlContextがnilでない場合、ネットワークの接続を作成する前に呼び出されます。 87 // 88 // ControlContext関数に渡されるネットワークおよびアドレスのパラメータは、必ずしもDialに渡されたものではありません。 89 // 例えば、Dialに"tcp"を渡すと、ControlContext関数は "tcp4" または "tcp6" とともに呼び出されます。 90 // 91 // ControlContextがnilでない場合、Controlは無視されます。 92 ControlContext func(ctx context.Context, network, address string, c syscall.RawConn) error 93 94 // もしmptcpStatusがMPTCPを許可する値に設定されている場合、"tcp(4|6)"というネットワークを使用するDialの呼び出しは、オペレーティングシステムでサポートされていればMPTCPを使用します。 95 mptcpStatus mptcpStatus 96 } 97 98 // MultipathTCPはMPTCPを使用するかどうかを報告します。 99 // 100 // このメソッドは、オペレーティングシステムがMPTCPをサポートしているかどうかをチェックしません。 101 func (d *Dialer) MultipathTCP() bool 102 103 // SetMultipathTCPは、オペレーティングシステムでサポートされている場合、[Dial] メソッドがMPTCPを使用するかどうかを指示します。 104 // このメソッドは、システムのデフォルトとGODEBUG=multipathtcp=...の設定を上書きします。 105 // 106 // ホストでMPTCPが利用できない場合やサーバーでサポートされていない場合、DialメソッドはTCPにフォールバックします。 107 func (d *Dialer) SetMultipathTCP(use bool) 108 109 // Dialは指定されたネットワークのアドレスに接続します。 110 // 111 // 知られているネットワークは "tcp", "tcp4" (IPv4のみ), "tcp6" (IPv6のみ), 112 // "udp", "udp4" (IPv4のみ), "udp6" (IPv6のみ), "ip", "ip4" 113 // (IPv4のみ), "ip6" (IPv6のみ), "unix", "unixgram" および 114 // "unixpacket" です。 115 // 116 // TCPとUDPのネットワークの場合、アドレスは "ホスト:ポート" の形式で指定します。 117 // ホストはリテラルのIPアドレスであるか、IPアドレスに解決できるホスト名である必要があります。 118 // ポートはリテラルのポート番号またはサービス名である必要があります。 119 // ホストがリテラルのIPv6アドレスの場合、"[2001:db8::1]:80" または "[fe80::1%zone]:80" のように角括弧で囲む必要があります。 120 // ゾーンは、RFC 4007で定義されているリテラルのIPv6アドレスのスコープを指定します。 121 // 関数 [JoinHostPort] と [SplitHostPort] は、この形式のホストとポートのペアを操作します。 122 // TCPを使用し、ホストが複数のIPアドレスに解決される場合、Dialは順番に各IPアドレスを試し、成功したものを使用します。 123 // 124 // 例: 125 // 126 // Dial("tcp", "golang.org:http") 127 // Dial("tcp", "192.0.2.1:http") 128 // Dial("tcp", "198.51.100.1:80") 129 // Dial("udp", "[2001:db8::1]:domain") 130 // Dial("udp", "[fe80::1%lo0]:53") 131 // Dial("tcp", ":80") 132 // 133 // IPネットワークの場合、ネットワークは "ip", "ip4" または "ip6" の後にコロンとリテラルのプロトコル番号またはプロトコル名が続き、 134 // アドレスは "ホスト" の形式となります。ホストはリテラルのIPアドレスまたはゾーン付きのリテラルのIPv6アドレスである必要があります。 135 // "0" や "255" などの広く知られていないプロトコル番号の場合、各オペレーティングシステムによって動作が異なることによります。 136 // 137 // 例: 138 // 139 // Dial("ip4:1", "192.0.2.1") 140 // Dial("ip6:ipv6-icmp", "2001:db8::1") 141 // Dial("ip6:58", "fe80::1%lo0") 142 // 143 // TCP、UDP、およびIPネットワークの場合、ホストが空白またはリテラルの未指定IPアドレスの場合、 144 // すなわち ":80", "0.0.0.0:80" または "[::]:80" などの場合、TCPおよびUDPでは、 145 // ""、"0.0.0.0" または "::" などの場合、IPでは、ローカルシステムが仮定されます。 146 // 147 // UNIXネットワークの場合、アドレスはファイルシステムのパスである必要があります。 148 func Dial(network, address string) (Conn, error) 149 150 // DialTimeoutは、タイムアウトを設定して [Dial] と同様の動作をします。 151 // 152 // 必要に応じて名前解決も含まれたタイムアウト処理が行われます。 153 // TCPを使用している場合、アドレスパラメータのホストが複数のIPアドレスに解決される場合は、 154 // タイムアウトは各連続したダイヤルに均等に分散され、それぞれが適切な時間の一部を接続に割り当てます。 155 // 156 // ネットワークとアドレスパラメータの詳細については、func Dialを参照してください。 157 func DialTimeout(network, address string, timeout time.Duration) (Conn, error) 158 159 // Dialは指定されたネットワーク上のアドレスに接続します。 160 // 161 // ネットワークとアドレスの詳細は、func Dialの説明を参照してください。 162 // 163 // Dialは内部的に [context.Background] を使用します。コンテキストを指定するには、[Dialer.DialContext] を使用してください。 164 func (d *Dialer) Dial(network, address string) (Conn, error) 165 166 // DialContextは、指定されたコンテキストを使用して、指定されたネットワーク上のアドレスに接続します。 167 // 168 // 提供されたコンテキストは、nilでない必要があります。接続が完了する前にコンテキストが期限切れになると、エラーが返されます。接続が成功した後、コンテキストの期限切れは接続に影響しません。 169 // 170 // TCPを使用し、アドレスパラメータのホストが複数のネットワークアドレスに解決される場合、ダイヤルタイムアウト(d.Timeoutまたはctxから)は、各連続したダイヤルに均等に分散されます。それぞれのダイヤルには、適切な接続時間の割合が与えられます。 171 // 例えば、ホストが4つのIPアドレスを持ち、タイムアウトが1分の場合、次のアドレスを試す前に、各単一のアドレスへの接続には15秒の時間が与えられます。 172 // 173 // ネットワークやアドレスパラメータの説明については、[Dial] 関数を参照してください。 174 func (d *Dialer) DialContext(ctx context.Context, network, address string) (Conn, error) 175 176 // ListenConfig はアドレスのリッスンに関するオプションを含んでいます。 177 type ListenConfig struct { 178 179 // Controlがnilでない場合、ネットワーク接続を作成した後、 180 // オペレーティングシステムにバインドする前に呼び出されます。 181 // 182 // Controlメソッドに渡されるネットワークとアドレスのパラメータは、 183 // 必ずしもListenに渡されるものとは限りません。例えば、"tcp"を 184 // Listenに渡すと、Control関数へは"tcp4"または"tcp6"が渡されます。 185 Control func(network, address string, c syscall.RawConn) error 186 187 // KeepAlive specifies the keep-alive period for network 188 // connections accepted by this listener. 189 // 190 // KeepAlive is ignored if KeepAliveConfig.Enable is true. 191 // 192 // If zero, keep-alive are enabled if supported by the protocol 193 // and operating system. Network protocols or operating systems 194 // that do not support keep-alive ignore this field. 195 // If negative, keep-alive are disabled. 196 KeepAlive time.Duration 197 198 // KeepAliveConfig specifies the keep-alive probe configuration 199 // for an active network connection, when supported by the 200 // protocol and operating system. 201 // 202 // If KeepAliveConfig.Enable is true, keep-alive probes are enabled. 203 // If KeepAliveConfig.Enable is false and KeepAlive is negative, 204 // keep-alive probes are disabled. 205 KeepAliveConfig KeepAliveConfig 206 207 // If mptcpStatus is set to a value allowing Multipath TCP (MPTCP) to be 208 // used, any call to Listen with "tcp(4|6)" as network will use MPTCP if 209 // supported by the operating system. 210 mptcpStatus mptcpStatus 211 } 212 213 // MultipathTCPはMPTCPが使用されるかどうかを報告します。 214 // 215 // このメソッドはオペレーティングシステムがMPTCPをサポートしているかどうかを確認しません。 216 func (lc *ListenConfig) MultipathTCP() bool 217 218 // SetMultipathTCPは、オペレーティングシステムがサポートしている場合、[Listen] メソッドがMPTCPを使用するかどうかを指示します。 219 // このメソッドは、システムのデフォルトおよびGODEBUG=multipathtcp=...の設定を上書きします。 220 // 221 // ホスト上でMPTCPが利用できない場合、またはクライアントがサポートしていない場合、 222 // ListenメソッドはTCPにフォールバックします。 223 func (lc *ListenConfig) SetMultipathTCP(use bool) 224 225 // Listenはローカルネットワークアドレスでアナウンスします。 226 // 227 // ネットワークおよびアドレスの詳細については、func Listenを参照してください。 228 func (lc *ListenConfig) Listen(ctx context.Context, network, address string) (Listener, error) 229 230 // ListenPacketはローカルネットワークアドレスでアナウンスします。 231 // 232 // ネットワークとアドレスのパラメーターの説明については、func ListenPacketを参照してください。 233 func (lc *ListenConfig) ListenPacket(ctx context.Context, network, address string) (PacketConn, error) 234 235 // Listenはローカルネットワークアドレスでアナウンスします。 236 // 237 // ネットワークは"tcp"、"tcp4"、"tcp6"、"unix"、または"unixpacket"である必要があります。 238 // 239 // TCPネットワークの場合、アドレスパラメータのホストが空または明示的に指定されていないIPアドレスの場合、Listenは利用可能なすべてのユニキャストおよびエニーキャストIPアドレスでリッスンします。 240 // IPv4のみを使用する場合は、ネットワークに"tcp4"を使用します。 241 // アドレスにはホスト名を使用できますが、これは推奨されないため、ホストのIPアドレスの最大1つのリスナーが作成されます。 242 // アドレスパラメータのポートが空または"0"の場合、例えば"127.0.0.1:"や"[::1]:0"のように、ポート番号が自動的に選択されます。 243 // [Listener] の [Addr] メソッドを使用して、選択されたポートを取得できます。 244 // 245 // ネットワークおよびアドレスパラメータの説明については、[Dial] 関数を参照してください。 246 // 247 // Listenは内部的にcontext.Backgroundを使用します。コンテキストを指定するには、[ListenConfig.Listen] を使用してください。 248 func Listen(network, address string) (Listener, error) 249 250 // ListenPacketはローカルネットワークアドレスでの通知を行います。 251 // 252 // ネットワークは「udp」「udp4」「udp6」「unixgram」またはIPトランスポートである必要があります。 253 // IPトランスポートは、次の形式で「ip」「ip4」、「ip6」のいずれかの後に「:」とリテラルのプロトコル番号またはプロトコル名が続きます。 254 // 例:「ip:1」または「ip:icmp」。 255 // 256 // UDPとIPネットワークの場合、アドレスパラメータのホストが空白またはリテラルの未指定のIPアドレスの場合、 257 // ListenPacketはマルチキャストIPアドレス以外のすべての利用可能なローカルシステムのIPアドレスでリスンします。 258 // IPv4のみを使用する場合は、ネットワークに「udp4」または「ip4:proto」を使用します。 259 // アドレスはホスト名を使用することもできますが、これは推奨されません。 260 // なぜなら、それによってホストのIPアドレスのうちの最大で1つのリスナが作成されるからです。 261 // アドレスパラメータのポートが空または「0」の場合、「127.0.0.1:」や「[::1]:0」といった形式で、ポート番号は自動的に選択されます。 262 // [PacketConn] のLocalAddrメソッドを使用して選択されたポートを特定することができます。 263 // 264 // ネットワークおよびアドレスパラメータの説明については、[Dial] 関数を参照してください。 265 // 266 // ListenPacketは内部的にcontext.Backgroundを使用します。コンテキストを指定するには、 267 // [ListenConfig.ListenPacket] を使用してください。 268 func ListenPacket(network, address string) (PacketConn, error)