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 }