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)