github.com/shogo82148/std@v1.22.1-0.20240327122250-4e474527810c/net/net.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 /* 6 Package netは、TCP/IP、UDP、ドメイン名の解決、およびUnixドメインソケットなど、ネットワークI/Oのためのポータブルなインターフェースを提供します。 7 8 このパッケージは、低レベルのネットワーキングプリミティブへのアクセスを提供していますが、ほとんどのクライアントは、[Dial]、[Listen]、Accept関数と関連する [Conn] と [Listener] インターフェースが提供する基本的なインターフェースだけを必要とします。crypto/tlsパッケージは、同じインターフェースと似たようなDialとListen関数を使用します。 9 10 Dial関数はサーバーに接続します: 11 12 conn, err := net.Dial("tcp", "golang.org:80") 13 if err != nil { 14 // エラーを処理する 15 } 16 fmt.Fprintf(conn, "GET / HTTP/1.0\r\n\r\n") 17 status, err := bufio.NewReader(conn).ReadString('\n') 18 // ... 19 20 Listen関数はサーバーを作成します: 21 22 ln, err := net.Listen("tcp", ":8080") 23 if err != nil { 24 // エラーを処理する 25 } 26 for { 27 conn, err := ln.Accept() 28 if err != nil { 29 // エラーを処理する 30 } 31 go handleConnection(conn) 32 } 33 34 # ネーム解決 35 36 ネーム解決の方法は、間接的にDialのような関数を使うか、[LookupHost] や [LookupAddr] のような関数を直接使うかによって、オペレーティングシステムによって異なります。 37 38 Unixシステムでは、名前を解決するための2つのオプションがあります。 39 /etc/resolv.confにリストされているサーバーに直接DNSリクエストを送信する純粋なGoリゾルバを使用するか、 40 getaddrinfoやgetnameinfoなどのCライブラリのルーチンを呼び出すcgoベースのリゾルバを使用するか、です。 41 42 Unixでは、ブロックされたDNSリクエストがゴルーチンだけを消費するため、 43 純粋なGoリゾルバがcgoリゾルバよりも優先されます。一方、ブロックされたC呼び出しは 44 オペレーティングシステムのスレッドを消費します。 45 cgoが利用可能な場合、さまざまな条件下でcgoベースのリゾルバが代わりに使用されます: 46 プログラムが直接DNSリクエストを行うことを許可しないシステム(OS X)上、 47 LOCALDOMAIN環境変数が存在する場合(空でも)、 48 RES_OPTIONSまたはHOSTALIASES環境変数が空でない場合、 49 ASR_CONFIG環境変数が空でない場合(OpenBSDのみ)、 50 /etc/resolv.confまたは/etc/nsswitch.confがGoリゾルバが実装していない機能の使用を指定している場合。 51 52 すべてのシステム(Plan 9を除く)で、cgoリゾルバが使用されている場合、 53 このパッケージは並行cgoルックアップ制限を適用して、システムがシステムスレッドを使い果たすのを防ぎます。 54 現在、同時ルックアップは500に制限されています。 55 56 リゾルバの決定は、GODEBUG環境変数のnetdns値をgoまたはcgoに設定することで 57 上書きすることができます(パッケージruntimeを参照)。 58 59 export GODEBUG=netdns=go # 純粋なGoリゾルバを強制する 60 export GODEBUG=netdns=cgo # ネイティブリゾルバを強制する(cgo、win32) 61 62 この判断は、Goソースツリーをビルドする際にも、netgoまたはnetcgoビルドタグを設定することで強制することができます。 63 64 GODEBUG=netdns=1のような数値のnetdns設定は、リゾルバが自身の判断に関するデバッグ情報を出力します。 65 特定のリゾルバを強制すると同時にデバッグ情報を出力するには、 66 2つの設定をプラス記号で結合します。例:GODEBUG=netdns=go+1。 67 68 macOSでは、netパッケージを使用するGoコードが-buildmode=c-archiveでビルドされる場合、 69 生成されたアーカイブをCプログラムにリンクする際に、Cコードをリンクするときに-lresolvを渡す必要があります。 70 71 Plan 9では、リゾルバは常に/net/csと/net/dnsにアクセスします。 72 73 Windowsでは、Go 1.18.x以前では、GetAddrInfoやDnsQueryなどのCライブラリ関数をリゾルバが常に使用していました。 74 */ 75 package net 76 77 import ( 78 "github.com/shogo82148/std/errors" 79 "github.com/shogo82148/std/io" 80 "github.com/shogo82148/std/time" 81 ) 82 83 // Addrはネットワークのエンドポイントアドレスを表します。 84 // 85 // 2つのメソッド [Addr.Network] および [Addr.String] は、通常、[Dial] の引数として渡すことができる文字列を返しますが、 86 // その文字列の形式や意味については実装次第です。 87 type Addr interface { 88 Network() string 89 String() string 90 } 91 92 // Connは汎用のストリーム指向のネットワーク接続です。 93 // 94 // 複数のgoroutineがConn上のメソッドを同時に呼び出すことができます。 95 type Conn interface { 96 Read(b []byte) (n int, err error) 97 98 Write(b []byte) (n int, err error) 99 100 Close() error 101 102 LocalAddr() Addr 103 104 RemoteAddr() Addr 105 106 SetDeadline(t time.Time) error 107 108 SetReadDeadline(t time.Time) error 109 110 SetWriteDeadline(t time.Time) error 111 } 112 113 // PacketConnは汎用のパケット指向のネットワーク接続です。 114 // 115 // 複数のゴルーチンは同時にPacketConnのメソッドを呼び出すことができます。 116 type PacketConn interface { 117 ReadFrom(p []byte) (n int, addr Addr, err error) 118 119 WriteTo(p []byte, addr Addr) (n int, err error) 120 121 Close() error 122 123 LocalAddr() Addr 124 125 SetDeadline(t time.Time) error 126 127 SetReadDeadline(t time.Time) error 128 129 SetWriteDeadline(t time.Time) error 130 } 131 132 // リスナーはストリーム指向のプロトコルのための汎用のネットワークリスナーです。 133 // 134 // 複数のゴルーチンが同時にリスナーのメソッドを呼び出すことができます。 135 type Listener interface { 136 Accept() (Conn, error) 137 138 Close() error 139 140 Addr() Addr 141 } 142 143 // Errorはネットワークエラーを表します。 144 type Error interface { 145 error 146 Timeout() bool 147 148 Temporary() bool 149 } 150 151 // OpErrorに含まれる様々なエラー。 152 var ( 153 ErrWriteToConnected = errors.New("use of WriteTo with pre-connected connection") 154 ) 155 156 // OpErrorは通常、netパッケージの関数によって返されるエラータイプです。これは操作、ネットワークタイプ、およびエラーのアドレスを説明します。 157 type OpError struct { 158 159 // Opはエラーの原因となった操作であり、 160 // "read"または"write"などの操作です。 161 Op string 162 163 // Netはこのエラーが発生したネットワークの種類です。 164 // 例えば、"tcp"や"udp6"などがあります。 165 Net string 166 167 // リモートネットワーク接続に関する操作(Dial、Read、またはWriteなど)において、ソースは対応するローカルネットワークアドレスです。 168 Source Addr 169 170 // Addrはこのエラーが発生したネットワークアドレスです。 171 // ListenやSetDeadlineなどのローカルな操作の場合、Addrは操作されるローカルエンドポイントのアドレスです。 172 // Dial、Read、またはWriteなどのリモートネットワーク接続に関する操作の場合、Addrはその接続のリモートアドレスです。 173 Addr Addr 174 175 // Errは操作中に発生したエラーです。 176 // Errorメソッドはエラーがnilの場合にパニックを起こします。 177 Err error 178 } 179 180 func (e *OpError) Unwrap() error 181 182 func (e *OpError) Error() string 183 184 func (e *OpError) Timeout() bool 185 186 func (e *OpError) Temporary() bool 187 188 // ParseErrorは文字列形式のネットワークアドレスパーサーのエラータイプです。 189 type ParseError struct { 190 191 // Typeは期待される文字列のタイプです。例えば、「IPアドレス」、「CIDRアドレス」などです。 192 Type string 193 194 // Textは不正なテキスト文字列です。 195 Text string 196 } 197 198 func (e *ParseError) Error() string 199 200 func (e *ParseError) Timeout() bool 201 func (e *ParseError) Temporary() bool 202 203 type AddrError struct { 204 Err string 205 Addr string 206 } 207 208 func (e *AddrError) Error() string 209 210 func (e *AddrError) Timeout() bool 211 func (e *AddrError) Temporary() bool 212 213 type UnknownNetworkError string 214 215 func (e UnknownNetworkError) Error() string 216 func (e UnknownNetworkError) Timeout() bool 217 func (e UnknownNetworkError) Temporary() bool 218 219 type InvalidAddrError string 220 221 func (e InvalidAddrError) Error() string 222 func (e InvalidAddrError) Timeout() bool 223 func (e InvalidAddrError) Temporary() bool 224 225 // DNSConfigErrorは、マシンのDNS設定を読み取る際のエラーを表します。 226 // (使用されていませんが、互換性のために保持されています。) 227 type DNSConfigError struct { 228 Err error 229 } 230 231 func (e *DNSConfigError) Unwrap() error 232 func (e *DNSConfigError) Error() string 233 func (e *DNSConfigError) Timeout() bool 234 func (e *DNSConfigError) Temporary() bool 235 236 // DNSErrorはDNSの検索エラーを表します。 237 type DNSError struct { 238 Err string 239 Name string 240 Server string 241 IsTimeout bool 242 IsTemporary bool 243 244 // IsNotFound is set to true when the requested name does not 245 // contain any records of the requested type (data not found), 246 // or the name itself was not found (NXDOMAIN). 247 IsNotFound bool 248 } 249 250 func (e *DNSError) Error() string 251 252 // Timeoutは、DNSルックアップがタイムアウトしたことが確認されたかどうかを報告します。 253 // これは常に確認できるわけではありません。DNSルックアップはタイムアウトにより失敗し、 254 // Timeoutがfalseを返す [DNSError] を返すことがあります。 255 func (e *DNSError) Timeout() bool 256 257 // Temporaryは、DNSエラーが一時的であることが確認されたかどうかを報告します。 258 // これは常に確認できるわけではありません。DNSルックアップは一時的なエラーにより失敗し、 259 // Temporaryがfalseを返す [DNSError] を返すことがあります。 260 func (e *DNSError) Temporary() bool 261 262 // ErrClosedは、既に閉じられたネットワーク接続またはI/Oが完了する前に他のゴルーチンによって閉じられたネットワーク接続上のI/O呼び出しによって返されるエラーです。これは他のエラーに包まれる場合があり、通常はerrors.Is(err, net.ErrClosed)を使用してテストする必要があります。 263 var ErrClosed error = errClosed 264 265 // Buffersは、書き込むバイトのゼロ以上のランを含んでいます。 266 // 267 // ある種の接続に対して、特定のマシンでは、これはOS固有のバッチ書き込み操作("writev"など)に最適化されます。 268 type Buffers [][]byte 269 270 var ( 271 _ io.WriterTo = (*Buffers)(nil) 272 _ io.Reader = (*Buffers)(nil) 273 ) 274 275 // WriteTo はバッファの内容を w に書き込みます。 276 // 277 // WriteTo は、[Buffers] に [io.WriterTo] を実装します。 278 // 279 // WriteTo は、0 <= i < len(v) の範囲の v[i] およびスライス v を変更しますが、v[i][j] (i, j は任意の値) は変更しません。 280 func (v *Buffers) WriteTo(w io.Writer) (n int64, err error) 281 282 // バッファから読み込む。 283 // 284 // Read は [Buffers] に [io.Reader] を実装します。 285 // 286 // Read はスライス v と v[i](ただし、0 <= i < len(v))を変更しますが、 287 // v[i][j](ただし、任意の i, j)は変更しません。 288 func (v *Buffers) Read(p []byte) (n int, err error)