github.com/shogo82148/std@v1.22.1-0.20240327122250-4e474527810c/net/tcpsock.go (about)

     1  // Copyright 2009 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/io"
     9  	"github.com/shogo82148/std/net/netip"
    10  	"github.com/shogo82148/std/os"
    11  	"github.com/shogo82148/std/syscall"
    12  	"github.com/shogo82148/std/time"
    13  )
    14  
    15  // TCPAddrはTCPエンドポイントのアドレスを表します。
    16  type TCPAddr struct {
    17  	IP   IP
    18  	Port int
    19  	Zone string
    20  }
    21  
    22  // AddrPortは [TCPAddr] aを [netip.AddrPort] として返します。
    23  //
    24  // もしa.Portがuint16に収まらない場合、静かに切り捨てられます。
    25  //
    26  // もしaがnilの場合、ゼロ値が返されます。
    27  func (a *TCPAddr) AddrPort() netip.AddrPort
    28  
    29  // Networkはアドレスのネットワーク名「tcp」を返します。
    30  func (a *TCPAddr) Network() string
    31  
    32  func (a *TCPAddr) String() string
    33  
    34  // ResolveTCPAddrはTCPエンドポイントのアドレスを返します。
    35  //
    36  // ネットワークはTCPのネットワーク名である必要があります。
    37  //
    38  // アドレスパラメータのホストがリテラルIPアドレスでない場合や、
    39  // ポートがリテラルのポート番号でない場合、ResolveTCPAddrは
    40  // TCPエンドポイントのアドレスに解決します。
    41  // そうでなければ、アドレスをリテラルのIPアドレスとポート番号のペアとして解析します。
    42  // アドレスパラメータはホスト名を使用することもできますが、
    43  // ホスト名のIPアドレスの一つを最大で返すため、推奨されていません。
    44  //
    45  // ネットワークとアドレスパラメータの詳細については、
    46  // [Dial] 関数の説明を参照してください。
    47  func ResolveTCPAddr(network, address string) (*TCPAddr, error)
    48  
    49  // TCPAddrFromAddrPortはaddrを [TCPAddr] として返します。もしaddrがIsValid()がfalseである場合、
    50  // 返されるTCPAddrにはnilのIPフィールドが含まれ、アドレスファミリーに依存しない未指定のアドレスを示します。
    51  func TCPAddrFromAddrPort(addr netip.AddrPort) *TCPAddr
    52  
    53  // TCPConnはTCPネットワーク接続の [Conn] インターフェースの実装です。
    54  type TCPConn struct {
    55  	conn
    56  }
    57  
    58  // KeepAliveConfig contains TCP keep-alive options.
    59  //
    60  // If the Idle, Interval, or Count fields are zero, a default value is chosen.
    61  // If a field is negative, the corresponding socket-level option will be left unchanged.
    62  //
    63  // Note that prior to Windows 10 version 1709, neither setting Idle and Interval
    64  // separately nor changing Count (which is usually 10) is supported.
    65  // Therefore, it's recommended to set both Idle and Interval to non-negative values
    66  // in conjunction with a -1 for Count on those old Windows if you intend to customize
    67  // the TCP keep-alive settings.
    68  // By contrast, if only one of Idle and Interval is set to a non-negative value,
    69  // the other will be set to the system default value, and ultimately,
    70  // set both Idle and Interval to negative values if you want to leave them unchanged.
    71  type KeepAliveConfig struct {
    72  	// If Enable is true, keep-alive probes are enabled.
    73  	Enable bool
    74  
    75  	// Idle is the time that the connection must be idle before
    76  	// the first keep-alive probe is sent.
    77  	// If zero, a default value of 15 seconds is used.
    78  	Idle time.Duration
    79  
    80  	// Interval is the time between keep-alive probes.
    81  	// If zero, a default value of 15 seconds is used.
    82  	Interval time.Duration
    83  
    84  	// Count is the maximum number of keep-alive probes that
    85  	// can go unanswered before dropping a connection.
    86  	// If zero, a default value of 9 is used.
    87  	Count int
    88  }
    89  
    90  // SyscallConnは生のネットワーク接続を返します。
    91  // これは [syscall.Conn] インターフェースを実装しています。
    92  func (c *TCPConn) SyscallConn() (syscall.RawConn, error)
    93  
    94  // ReadFrom は [io.ReaderFrom] の ReadFrom メソッドを実装します。
    95  func (c *TCPConn) ReadFrom(r io.Reader) (int64, error)
    96  
    97  // WriteToは、io.WriterToのWriteToメソッドを実装します。
    98  func (c *TCPConn) WriteTo(w io.Writer) (int64, error)
    99  
   100  // CloseReadはTCP接続の読み込み側をシャットダウンします。
   101  // ほとんどの呼び出し元は、単にCloseを使用するだけで十分です。
   102  func (c *TCPConn) CloseRead() error
   103  
   104  // CloseWrite は TCP 接続の書き込み側をシャットダウンします。
   105  // ほとんどの呼び出し元は Close を使用すべきです。
   106  func (c *TCPConn) CloseWrite() error
   107  
   108  // SetLingerは、まだ送信または確認待ちのデータがある接続に対してCloseの振る舞いを設定します。
   109  // sec < 0(デフォルト)の場合、オペレーティングシステムはバックグラウンドでデータの送信を完了します。
   110  // sec == 0の場合、オペレーティングシステムは未送信または確認待ちのデータを破棄します。
   111  // sec > 0の場合、データはsec < 0と同様にバックグラウンドで送信されます。
   112  // Linuxを含む一部のオペレーティングシステムでは、これによりCloseが全てのデータの送信または破棄が完了するまでブロックする場合があります。
   113  // sec秒経過後、未送信のデータは破棄される可能性があります。
   114  func (c *TCPConn) SetLinger(sec int) error
   115  
   116  // SetKeepAliveは、オペレーティングシステムが接続に対して
   117  // keep-aliveメッセージを送信するかどうかを設定します。
   118  func (c *TCPConn) SetKeepAlive(keepalive bool) error
   119  
   120  // SetKeepAlivePeriod sets the duration the connection needs to
   121  // remain idle before TCP starts sending keepalive probes.
   122  //
   123  // Note that calling this method on Windows will reset the KeepAliveInterval
   124  // to the default system value, which is normally 1 second.
   125  func (c *TCPConn) SetKeepAlivePeriod(d time.Duration) error
   126  
   127  // SetNoDelayは、パケットの送信を遅延させるかどうかを制御します。これにより、より少ないパケットで送信することが期待されます(Nagleのアルゴリズム)。デフォルト値はtrue(遅延なし)であり、Writeの後で可能な限りすぐにデータが送信されます。
   128  func (c *TCPConn) SetNoDelay(noDelay bool) error
   129  
   130  // MultipathTCPは、現在の接続がMPTCPを使用しているかどうかを報告します。
   131  //
   132  // ホスト、他のピア、またはその間にあるデバイスによってMultipath TCPがサポートされていない場合、
   133  // 意図的に/意図せずにフィルタリングされた場合、TCPへのフォールバックが行われます。
   134  // このメソッドは、MPTCPが使用されているかどうかを確認するために最善を尽くします。
   135  //
   136  // Linuxでは、カーネルのバージョンがv5.16以上の場合、さらに条件が検証され、結果が改善されます。
   137  func (c *TCPConn) MultipathTCP() (bool, error)
   138  
   139  // DialTCPはTCPネットワークのための [Dial] のように振る舞います。
   140  //
   141  // ネットワークはTCPネットワーク名でなければなりません。詳細についてはfunc Dialを参照してください。
   142  //
   143  // laddrがnilの場合、自動的にローカルアドレスが選択されます。
   144  // raddrのIPフィールドがnilまたは未指定のIPアドレスの場合、ローカルシステムが使用されます。
   145  func DialTCP(network string, laddr, raddr *TCPAddr) (*TCPConn, error)
   146  
   147  // TCPListenerはTCPネットワークリスナーです。クライアントは通常、TCPを仮定する代わりに [Listener] 型の変数を使用するべきです。
   148  type TCPListener struct {
   149  	fd *netFD
   150  	lc ListenConfig
   151  }
   152  
   153  // SyscallConn は生のネットワーク接続を返します。
   154  // これは [syscall.Conn] インターフェースを実装しています。
   155  //
   156  // 返された RawConn は Control の呼び出しのみをサポートします。
   157  // Read と Write はエラーを返します。
   158  func (l *TCPListener) SyscallConn() (syscall.RawConn, error)
   159  
   160  // AcceptTCPは次の着信呼び出しを受け入れ、新しい接続を返します。
   161  func (l *TCPListener) AcceptTCP() (*TCPConn, error)
   162  
   163  // Accept implements the Accept method in the [Listener] interface; it
   164  // waits for the next call and returns a generic [Conn].
   165  func (l *TCPListener) Accept() (Conn, error)
   166  
   167  // Close は TCP アドレスのリスニングを停止します。
   168  // 既に受け入れられた接続は閉じられません。
   169  func (l *TCPListener) Close() error
   170  
   171  // Addrはリスナーのネットワークアドレス、[*TCPAddr] を返します。
   172  // 返されるAddrはAddrのすべての呼び出しで共有されるため、
   173  // 変更しないでください。
   174  func (l *TCPListener) Addr() Addr
   175  
   176  // SetDeadlineはリスナーに関連付けられた締め切りを設定します。
   177  // ゼロの時刻値は締め切りを無効にします。
   178  func (l *TCPListener) SetDeadline(t time.Time) error
   179  
   180  // File は元の [os.File] のコピーを返します。
   181  // 終了した後、f を閉じる責任は呼び出し元にあります。
   182  // l を閉じても f には影響を与えませんし、f を閉じても l には影響を与えません。
   183  //
   184  // 返された os.File のファイルディスクリプタは、接続のものとは異なります。
   185  // この複製を使用して元のもののプロパティを変更しようとすると、
   186  // 望ましい効果が現れるかどうかは不明です。
   187  func (l *TCPListener) File() (f *os.File, err error)
   188  
   189  // ListenTCPはTCPネットワーク用の [Listen] のように機能します。
   190  //
   191  // ネットワークはTCPネットワーク名でなければなりません。詳細はfunc Dialを参照してください。
   192  //
   193  // laddrのIPフィールドがnilまたは未指定のIPアドレスの場合、ListenTCPはローカルシステムの利用可能なユニキャストおよびエニーキャストIPアドレスすべてでリスンします。
   194  // laddrのPortフィールドが0の場合、ポート番号は自動的に選択されます。
   195  func ListenTCP(network string, laddr *TCPAddr) (*TCPListener, error)