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

     1  // Copyright 2012 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_test
     6  
     7  import (
     8  	"github.com/shogo82148/std/context"
     9  	"github.com/shogo82148/std/fmt"
    10  	"github.com/shogo82148/std/io"
    11  	"github.com/shogo82148/std/log"
    12  	"github.com/shogo82148/std/net"
    13  	"github.com/shogo82148/std/time"
    14  )
    15  
    16  func ExampleListener() {
    17  	// ローカルシステムの利用可能なすべてのユニキャストおよび
    18  	// IPv4マルチキャストアドレス上のTCPポート2000でリッスンします。
    19  	l, err := net.Listen("tcp", ":2000")
    20  	if err != nil {
    21  		log.Fatal(err)
    22  	}
    23  	defer l.Close()
    24  	for {
    25  		// Wait for a connection.
    26  		conn, err := l.Accept()
    27  		if err != nil {
    28  			log.Fatal(err)
    29  		}
    30  		// 新しいgoroutineで接続を処理する。
    31  		// ループはその後、受け付けを再開するため、
    32  		// 複数の接続を同時に処理することが可能です。
    33  		go func(c net.Conn) {
    34  			// すべての受信データをエコーします。
    35  			io.Copy(c, c)
    36  			// 接続をシャットダウンします。
    37  			c.Close()
    38  		}(conn)
    39  	}
    40  }
    41  
    42  func ExampleDialer() {
    43  	var d net.Dialer
    44  	ctx, cancel := context.WithTimeout(context.Background(), time.Minute)
    45  	defer cancel()
    46  
    47  	conn, err := d.DialContext(ctx, "tcp", "localhost:12345")
    48  	if err != nil {
    49  		log.Fatalf("Failed to dial: %v", err)
    50  	}
    51  	defer conn.Close()
    52  
    53  	if _, err := conn.Write([]byte("Hello, World!")); err != nil {
    54  		log.Fatal(err)
    55  	}
    56  }
    57  
    58  func ExampleDialer_unix() {
    59  	// DialUnixはcontext.Contextパラメータを受け取りません。この例は、
    60  	// Contextを使用してUnixソケットにダイヤルする方法を示しています。ただし、
    61  	// Contextはダイヤル操作にのみ適用されます。接続が確立された後には適用されません。
    62  	var d net.Dialer
    63  	ctx, cancel := context.WithTimeout(context.Background(), time.Minute)
    64  	defer cancel()
    65  
    66  	d.LocalAddr = nil // もしローカルのアドレスがあれば、ここに追加してください。
    67  	raddr := net.UnixAddr{Name: "/path/to/unix.sock", Net: "unix"}
    68  	conn, err := d.DialContext(ctx, "unix", raddr.String())
    69  	if err != nil {
    70  		log.Fatalf("Failed to dial: %v", err)
    71  	}
    72  	defer conn.Close()
    73  	if _, err := conn.Write([]byte("Hello, socket!")); err != nil {
    74  		log.Fatal(err)
    75  	}
    76  }
    77  
    78  func ExampleIPv4() {
    79  	fmt.Println(net.IPv4(8, 8, 8, 8))
    80  
    81  	// Output:
    82  	// 8.8.8.8
    83  }
    84  
    85  func ExampleParseCIDR() {
    86  	ipv4Addr, ipv4Net, err := net.ParseCIDR("192.0.2.1/24")
    87  	if err != nil {
    88  		log.Fatal(err)
    89  	}
    90  	fmt.Println(ipv4Addr)
    91  	fmt.Println(ipv4Net)
    92  
    93  	ipv6Addr, ipv6Net, err := net.ParseCIDR("2001:db8:a0b:12f0::1/32")
    94  	if err != nil {
    95  		log.Fatal(err)
    96  	}
    97  	fmt.Println(ipv6Addr)
    98  	fmt.Println(ipv6Net)
    99  
   100  	// Output:
   101  	// 192.0.2.1
   102  	// 192.0.2.0/24
   103  	// 2001:db8:a0b:12f0::1
   104  	// 2001:db8::/32
   105  }
   106  
   107  func ExampleParseIP() {
   108  	fmt.Println(net.ParseIP("192.0.2.1"))
   109  	fmt.Println(net.ParseIP("2001:db8::68"))
   110  	fmt.Println(net.ParseIP("192.0.2"))
   111  
   112  	// Output:
   113  	// 192.0.2.1
   114  	// 2001:db8::68
   115  	// <nil>
   116  }
   117  
   118  func ExampleIP_DefaultMask() {
   119  	ip := net.ParseIP("192.0.2.1")
   120  	fmt.Println(ip.DefaultMask())
   121  
   122  	// Output:
   123  	// ffffff00
   124  }
   125  
   126  func ExampleIP_Equal() {
   127  	ipv4DNS := net.ParseIP("8.8.8.8")
   128  	ipv4Lo := net.ParseIP("127.0.0.1")
   129  	ipv6DNS := net.ParseIP("0:0:0:0:0:FFFF:0808:0808")
   130  
   131  	fmt.Println(ipv4DNS.Equal(ipv4DNS))
   132  	fmt.Println(ipv4DNS.Equal(ipv4Lo))
   133  	fmt.Println(ipv4DNS.Equal(ipv6DNS))
   134  
   135  	// Output:
   136  	// true
   137  	// false
   138  	// true
   139  }
   140  
   141  func ExampleIP_IsGlobalUnicast() {
   142  	ipv6Global := net.ParseIP("2000::")
   143  	ipv6UniqLocal := net.ParseIP("2000::")
   144  	ipv6Multi := net.ParseIP("FF00::")
   145  
   146  	ipv4Private := net.ParseIP("10.255.0.0")
   147  	ipv4Public := net.ParseIP("8.8.8.8")
   148  	ipv4Broadcast := net.ParseIP("255.255.255.255")
   149  
   150  	fmt.Println(ipv6Global.IsGlobalUnicast())
   151  	fmt.Println(ipv6UniqLocal.IsGlobalUnicast())
   152  	fmt.Println(ipv6Multi.IsGlobalUnicast())
   153  
   154  	fmt.Println(ipv4Private.IsGlobalUnicast())
   155  	fmt.Println(ipv4Public.IsGlobalUnicast())
   156  	fmt.Println(ipv4Broadcast.IsGlobalUnicast())
   157  
   158  	// Output:
   159  	// true
   160  	// true
   161  	// false
   162  	// true
   163  	// true
   164  	// false
   165  }
   166  
   167  func ExampleIP_IsInterfaceLocalMulticast() {
   168  	ipv6InterfaceLocalMulti := net.ParseIP("ff01::1")
   169  	ipv6Global := net.ParseIP("2000::")
   170  	ipv4 := net.ParseIP("255.0.0.0")
   171  
   172  	fmt.Println(ipv6InterfaceLocalMulti.IsInterfaceLocalMulticast())
   173  	fmt.Println(ipv6Global.IsInterfaceLocalMulticast())
   174  	fmt.Println(ipv4.IsInterfaceLocalMulticast())
   175  
   176  	// Output:
   177  	// true
   178  	// false
   179  	// false
   180  }
   181  
   182  func ExampleIP_IsLinkLocalMulticast() {
   183  	ipv6LinkLocalMulti := net.ParseIP("ff02::2")
   184  	ipv6LinkLocalUni := net.ParseIP("fe80::")
   185  	ipv4LinkLocalMulti := net.ParseIP("224.0.0.0")
   186  	ipv4LinkLocalUni := net.ParseIP("169.254.0.0")
   187  
   188  	fmt.Println(ipv6LinkLocalMulti.IsLinkLocalMulticast())
   189  	fmt.Println(ipv6LinkLocalUni.IsLinkLocalMulticast())
   190  	fmt.Println(ipv4LinkLocalMulti.IsLinkLocalMulticast())
   191  	fmt.Println(ipv4LinkLocalUni.IsLinkLocalMulticast())
   192  
   193  	// Output:
   194  	// true
   195  	// false
   196  	// true
   197  	// false
   198  }
   199  
   200  func ExampleIP_IsLinkLocalUnicast() {
   201  	ipv6LinkLocalUni := net.ParseIP("fe80::")
   202  	ipv6Global := net.ParseIP("2000::")
   203  	ipv4LinkLocalUni := net.ParseIP("169.254.0.0")
   204  	ipv4LinkLocalMulti := net.ParseIP("224.0.0.0")
   205  
   206  	fmt.Println(ipv6LinkLocalUni.IsLinkLocalUnicast())
   207  	fmt.Println(ipv6Global.IsLinkLocalUnicast())
   208  	fmt.Println(ipv4LinkLocalUni.IsLinkLocalUnicast())
   209  	fmt.Println(ipv4LinkLocalMulti.IsLinkLocalUnicast())
   210  
   211  	// Output:
   212  	// true
   213  	// false
   214  	// true
   215  	// false
   216  }
   217  
   218  func ExampleIP_IsLoopback() {
   219  	ipv6Lo := net.ParseIP("::1")
   220  	ipv6 := net.ParseIP("ff02::1")
   221  	ipv4Lo := net.ParseIP("127.0.0.0")
   222  	ipv4 := net.ParseIP("128.0.0.0")
   223  
   224  	fmt.Println(ipv6Lo.IsLoopback())
   225  	fmt.Println(ipv6.IsLoopback())
   226  	fmt.Println(ipv4Lo.IsLoopback())
   227  	fmt.Println(ipv4.IsLoopback())
   228  
   229  	// Output:
   230  	// true
   231  	// false
   232  	// true
   233  	// false
   234  }
   235  
   236  func ExampleIP_IsMulticast() {
   237  	ipv6Multi := net.ParseIP("FF00::")
   238  	ipv6LinkLocalMulti := net.ParseIP("ff02::1")
   239  	ipv6Lo := net.ParseIP("::1")
   240  	ipv4Multi := net.ParseIP("239.0.0.0")
   241  	ipv4LinkLocalMulti := net.ParseIP("224.0.0.0")
   242  	ipv4Lo := net.ParseIP("127.0.0.0")
   243  
   244  	fmt.Println(ipv6Multi.IsMulticast())
   245  	fmt.Println(ipv6LinkLocalMulti.IsMulticast())
   246  	fmt.Println(ipv6Lo.IsMulticast())
   247  	fmt.Println(ipv4Multi.IsMulticast())
   248  	fmt.Println(ipv4LinkLocalMulti.IsMulticast())
   249  	fmt.Println(ipv4Lo.IsMulticast())
   250  
   251  	// Output:
   252  	// true
   253  	// true
   254  	// false
   255  	// true
   256  	// true
   257  	// false
   258  }
   259  
   260  func ExampleIP_IsPrivate() {
   261  	ipv6Private := net.ParseIP("fc00::")
   262  	ipv6Public := net.ParseIP("fe00::")
   263  	ipv4Private := net.ParseIP("10.255.0.0")
   264  	ipv4Public := net.ParseIP("11.0.0.0")
   265  
   266  	fmt.Println(ipv6Private.IsPrivate())
   267  	fmt.Println(ipv6Public.IsPrivate())
   268  	fmt.Println(ipv4Private.IsPrivate())
   269  	fmt.Println(ipv4Public.IsPrivate())
   270  
   271  	// Output:
   272  	// true
   273  	// false
   274  	// true
   275  	// false
   276  }
   277  
   278  func ExampleIP_IsUnspecified() {
   279  	ipv6Unspecified := net.ParseIP("::")
   280  	ipv6Specified := net.ParseIP("fe00::")
   281  	ipv4Unspecified := net.ParseIP("0.0.0.0")
   282  	ipv4Specified := net.ParseIP("8.8.8.8")
   283  
   284  	fmt.Println(ipv6Unspecified.IsUnspecified())
   285  	fmt.Println(ipv6Specified.IsUnspecified())
   286  	fmt.Println(ipv4Unspecified.IsUnspecified())
   287  	fmt.Println(ipv4Specified.IsUnspecified())
   288  
   289  	// Output:
   290  	// true
   291  	// false
   292  	// true
   293  	// false
   294  }
   295  
   296  func ExampleIP_Mask() {
   297  	ipv4Addr := net.ParseIP("192.0.2.1")
   298  	// このマスクはIPv4の/24サブネットに対応しています。
   299  	ipv4Mask := net.CIDRMask(24, 32)
   300  	fmt.Println(ipv4Addr.Mask(ipv4Mask))
   301  
   302  	ipv6Addr := net.ParseIP("2001:db8:a0b:12f0::1")
   303  	// このマスクはIPv6の/32サブネットに対応しています。
   304  	ipv6Mask := net.CIDRMask(32, 128)
   305  	fmt.Println(ipv6Addr.Mask(ipv6Mask))
   306  
   307  	// Output:
   308  	// 192.0.2.0
   309  	// 2001:db8::
   310  }
   311  
   312  func ExampleIP_String() {
   313  	ipv6 := net.IP{0xfc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
   314  	ipv4 := net.IPv4(10, 255, 0, 0)
   315  
   316  	fmt.Println(ipv6.String())
   317  	fmt.Println(ipv4.String())
   318  
   319  	// Output:
   320  	// fc00::
   321  	// 10.255.0.0
   322  }
   323  
   324  func ExampleIP_To16() {
   325  	ipv6 := net.IP{0xfc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
   326  	ipv4 := net.IPv4(10, 255, 0, 0)
   327  
   328  	fmt.Println(ipv6.To16())
   329  	fmt.Println(ipv4.To16())
   330  
   331  	// Output:
   332  	// fc00::
   333  	// 10.255.0.0
   334  }
   335  
   336  func ExampleIP_to4() {
   337  	ipv6 := net.IP{0xfc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
   338  	ipv4 := net.IPv4(10, 255, 0, 0)
   339  
   340  	fmt.Println(ipv6.To4())
   341  	fmt.Println(ipv4.To4())
   342  
   343  	// Output:
   344  	// <nil>
   345  	// 10.255.0.0
   346  }
   347  
   348  func ExampleCIDRMask() {
   349  	// このマスクはIPv4の/31サブネットに対応しています。
   350  	fmt.Println(net.CIDRMask(31, 32))
   351  
   352  	// このマスクはIPv6の/64サブネットに対応しています。
   353  	fmt.Println(net.CIDRMask(64, 128))
   354  
   355  	// Output:
   356  	// fffffffe
   357  	// ffffffffffffffff0000000000000000
   358  }
   359  
   360  func ExampleIPv4Mask() {
   361  	fmt.Println(net.IPv4Mask(255, 255, 255, 0))
   362  
   363  	// Output:
   364  	// ffffff00
   365  }
   366  
   367  func ExampleUDPConn_WriteTo() {
   368  	// Dialとは異なり、ListenPacketはピアとの関連付けなしで
   369  	// 接続を作成します。
   370  	conn, err := net.ListenPacket("udp", ":0")
   371  	if err != nil {
   372  		log.Fatal(err)
   373  	}
   374  	defer conn.Close()
   375  
   376  	dst, err := net.ResolveUDPAddr("udp", "192.0.2.1:2000")
   377  	if err != nil {
   378  		log.Fatal(err)
   379  	}
   380  
   381  	// この接続は、指定したアドレスにデータを書き込むことができます。
   382  	_, err = conn.WriteTo([]byte("data"), dst)
   383  	if err != nil {
   384  		log.Fatal(err)
   385  	}
   386  }