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)