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)