example_test.go 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387
  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. package net_test
  5. import (
  6. "context"
  7. "fmt"
  8. "io"
  9. "log"
  10. "net"
  11. "time"
  12. )
  13. func ExampleListener() {
  14. // Listen on TCP port 2000 on all available unicast and
  15. // anycast IP addresses of the local system.
  16. l, err := net.Listen("tcp", ":2000")
  17. if err != nil {
  18. log.Fatal(err)
  19. }
  20. defer l.Close()
  21. for {
  22. // Wait for a connection.
  23. conn, err := l.Accept()
  24. if err != nil {
  25. log.Fatal(err)
  26. }
  27. // Handle the connection in a new goroutine.
  28. // The loop then returns to accepting, so that
  29. // multiple connections may be served concurrently.
  30. go func(c net.Conn) {
  31. // Echo all incoming data.
  32. io.Copy(c, c)
  33. // Shut down the connection.
  34. c.Close()
  35. }(conn)
  36. }
  37. }
  38. func ExampleDialer() {
  39. var d net.Dialer
  40. ctx, cancel := context.WithTimeout(context.Background(), time.Minute)
  41. defer cancel()
  42. conn, err := d.DialContext(ctx, "tcp", "localhost:12345")
  43. if err != nil {
  44. log.Fatalf("Failed to dial: %v", err)
  45. }
  46. defer conn.Close()
  47. if _, err := conn.Write([]byte("Hello, World!")); err != nil {
  48. log.Fatal(err)
  49. }
  50. }
  51. func ExampleDialer_unix() {
  52. // DialUnix does not take a context.Context parameter. This example shows
  53. // how to dial a Unix socket with a Context. Note that the Context only
  54. // applies to the dial operation; it does not apply to the connection once
  55. // it has been established.
  56. var d net.Dialer
  57. ctx, cancel := context.WithTimeout(context.Background(), time.Minute)
  58. defer cancel()
  59. d.LocalAddr = nil // if you have a local addr, add it here
  60. raddr := net.UnixAddr{Name: "/path/to/unix.sock", Net: "unix"}
  61. conn, err := d.DialContext(ctx, "unix", raddr.String())
  62. if err != nil {
  63. log.Fatalf("Failed to dial: %v", err)
  64. }
  65. defer conn.Close()
  66. if _, err := conn.Write([]byte("Hello, socket!")); err != nil {
  67. log.Fatal(err)
  68. }
  69. }
  70. func ExampleIPv4() {
  71. fmt.Println(net.IPv4(8, 8, 8, 8))
  72. // Output:
  73. // 8.8.8.8
  74. }
  75. func ExampleParseCIDR() {
  76. ipv4Addr, ipv4Net, err := net.ParseCIDR("192.0.2.1/24")
  77. if err != nil {
  78. log.Fatal(err)
  79. }
  80. fmt.Println(ipv4Addr)
  81. fmt.Println(ipv4Net)
  82. ipv6Addr, ipv6Net, err := net.ParseCIDR("2001:db8:a0b:12f0::1/32")
  83. if err != nil {
  84. log.Fatal(err)
  85. }
  86. fmt.Println(ipv6Addr)
  87. fmt.Println(ipv6Net)
  88. // Output:
  89. // 192.0.2.1
  90. // 192.0.2.0/24
  91. // 2001:db8:a0b:12f0::1
  92. // 2001:db8::/32
  93. }
  94. func ExampleParseIP() {
  95. fmt.Println(net.ParseIP("192.0.2.1"))
  96. fmt.Println(net.ParseIP("2001:db8::68"))
  97. fmt.Println(net.ParseIP("192.0.2"))
  98. // Output:
  99. // 192.0.2.1
  100. // 2001:db8::68
  101. // <nil>
  102. }
  103. func ExampleIP_DefaultMask() {
  104. ip := net.ParseIP("192.0.2.1")
  105. fmt.Println(ip.DefaultMask())
  106. // Output:
  107. // ffffff00
  108. }
  109. func ExampleIP_Equal() {
  110. ipv4DNS := net.ParseIP("8.8.8.8")
  111. ipv4Lo := net.ParseIP("127.0.0.1")
  112. ipv6DNS := net.ParseIP("0:0:0:0:0:FFFF:0808:0808")
  113. fmt.Println(ipv4DNS.Equal(ipv4DNS))
  114. fmt.Println(ipv4DNS.Equal(ipv4Lo))
  115. fmt.Println(ipv4DNS.Equal(ipv6DNS))
  116. // Output:
  117. // true
  118. // false
  119. // true
  120. }
  121. func ExampleIP_IsGlobalUnicast() {
  122. ipv6Global := net.ParseIP("2000::")
  123. ipv6UniqLocal := net.ParseIP("2000::")
  124. ipv6Multi := net.ParseIP("FF00::")
  125. ipv4Private := net.ParseIP("10.255.0.0")
  126. ipv4Public := net.ParseIP("8.8.8.8")
  127. ipv4Broadcast := net.ParseIP("255.255.255.255")
  128. fmt.Println(ipv6Global.IsGlobalUnicast())
  129. fmt.Println(ipv6UniqLocal.IsGlobalUnicast())
  130. fmt.Println(ipv6Multi.IsGlobalUnicast())
  131. fmt.Println(ipv4Private.IsGlobalUnicast())
  132. fmt.Println(ipv4Public.IsGlobalUnicast())
  133. fmt.Println(ipv4Broadcast.IsGlobalUnicast())
  134. // Output:
  135. // true
  136. // true
  137. // false
  138. // true
  139. // true
  140. // false
  141. }
  142. func ExampleIP_IsInterfaceLocalMulticast() {
  143. ipv6InterfaceLocalMulti := net.ParseIP("ff01::1")
  144. ipv6Global := net.ParseIP("2000::")
  145. ipv4 := net.ParseIP("255.0.0.0")
  146. fmt.Println(ipv6InterfaceLocalMulti.IsInterfaceLocalMulticast())
  147. fmt.Println(ipv6Global.IsInterfaceLocalMulticast())
  148. fmt.Println(ipv4.IsInterfaceLocalMulticast())
  149. // Output:
  150. // true
  151. // false
  152. // false
  153. }
  154. func ExampleIP_IsLinkLocalMulticast() {
  155. ipv6LinkLocalMulti := net.ParseIP("ff02::2")
  156. ipv6LinkLocalUni := net.ParseIP("fe80::")
  157. ipv4LinkLocalMulti := net.ParseIP("224.0.0.0")
  158. ipv4LinkLocalUni := net.ParseIP("169.254.0.0")
  159. fmt.Println(ipv6LinkLocalMulti.IsLinkLocalMulticast())
  160. fmt.Println(ipv6LinkLocalUni.IsLinkLocalMulticast())
  161. fmt.Println(ipv4LinkLocalMulti.IsLinkLocalMulticast())
  162. fmt.Println(ipv4LinkLocalUni.IsLinkLocalMulticast())
  163. // Output:
  164. // true
  165. // false
  166. // true
  167. // false
  168. }
  169. func ExampleIP_IsLinkLocalUnicast() {
  170. ipv6LinkLocalUni := net.ParseIP("fe80::")
  171. ipv6Global := net.ParseIP("2000::")
  172. ipv4LinkLocalUni := net.ParseIP("169.254.0.0")
  173. ipv4LinkLocalMulti := net.ParseIP("224.0.0.0")
  174. fmt.Println(ipv6LinkLocalUni.IsLinkLocalUnicast())
  175. fmt.Println(ipv6Global.IsLinkLocalUnicast())
  176. fmt.Println(ipv4LinkLocalUni.IsLinkLocalUnicast())
  177. fmt.Println(ipv4LinkLocalMulti.IsLinkLocalUnicast())
  178. // Output:
  179. // true
  180. // false
  181. // true
  182. // false
  183. }
  184. func ExampleIP_IsLoopback() {
  185. ipv6Lo := net.ParseIP("::1")
  186. ipv6 := net.ParseIP("ff02::1")
  187. ipv4Lo := net.ParseIP("127.0.0.0")
  188. ipv4 := net.ParseIP("128.0.0.0")
  189. fmt.Println(ipv6Lo.IsLoopback())
  190. fmt.Println(ipv6.IsLoopback())
  191. fmt.Println(ipv4Lo.IsLoopback())
  192. fmt.Println(ipv4.IsLoopback())
  193. // Output:
  194. // true
  195. // false
  196. // true
  197. // false
  198. }
  199. func ExampleIP_IsMulticast() {
  200. ipv6Multi := net.ParseIP("FF00::")
  201. ipv6LinkLocalMulti := net.ParseIP("ff02::1")
  202. ipv6Lo := net.ParseIP("::1")
  203. ipv4Multi := net.ParseIP("239.0.0.0")
  204. ipv4LinkLocalMulti := net.ParseIP("224.0.0.0")
  205. ipv4Lo := net.ParseIP("127.0.0.0")
  206. fmt.Println(ipv6Multi.IsMulticast())
  207. fmt.Println(ipv6LinkLocalMulti.IsMulticast())
  208. fmt.Println(ipv6Lo.IsMulticast())
  209. fmt.Println(ipv4Multi.IsMulticast())
  210. fmt.Println(ipv4LinkLocalMulti.IsMulticast())
  211. fmt.Println(ipv4Lo.IsMulticast())
  212. // Output:
  213. // true
  214. // true
  215. // false
  216. // true
  217. // true
  218. // false
  219. }
  220. func ExampleIP_IsPrivate() {
  221. ipv6Private := net.ParseIP("fc00::")
  222. ipv6Public := net.ParseIP("fe00::")
  223. ipv4Private := net.ParseIP("10.255.0.0")
  224. ipv4Public := net.ParseIP("11.0.0.0")
  225. fmt.Println(ipv6Private.IsPrivate())
  226. fmt.Println(ipv6Public.IsPrivate())
  227. fmt.Println(ipv4Private.IsPrivate())
  228. fmt.Println(ipv4Public.IsPrivate())
  229. // Output:
  230. // true
  231. // false
  232. // true
  233. // false
  234. }
  235. func ExampleIP_IsUnspecified() {
  236. ipv6Unspecified := net.ParseIP("::")
  237. ipv6Specified := net.ParseIP("fe00::")
  238. ipv4Unspecified := net.ParseIP("0.0.0.0")
  239. ipv4Specified := net.ParseIP("8.8.8.8")
  240. fmt.Println(ipv6Unspecified.IsUnspecified())
  241. fmt.Println(ipv6Specified.IsUnspecified())
  242. fmt.Println(ipv4Unspecified.IsUnspecified())
  243. fmt.Println(ipv4Specified.IsUnspecified())
  244. // Output:
  245. // true
  246. // false
  247. // true
  248. // false
  249. }
  250. func ExampleIP_Mask() {
  251. ipv4Addr := net.ParseIP("192.0.2.1")
  252. // This mask corresponds to a /24 subnet for IPv4.
  253. ipv4Mask := net.CIDRMask(24, 32)
  254. fmt.Println(ipv4Addr.Mask(ipv4Mask))
  255. ipv6Addr := net.ParseIP("2001:db8:a0b:12f0::1")
  256. // This mask corresponds to a /32 subnet for IPv6.
  257. ipv6Mask := net.CIDRMask(32, 128)
  258. fmt.Println(ipv6Addr.Mask(ipv6Mask))
  259. // Output:
  260. // 192.0.2.0
  261. // 2001:db8::
  262. }
  263. func ExampleIP_String() {
  264. ipv6 := net.IP{0xfc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
  265. ipv4 := net.IPv4(10, 255, 0, 0)
  266. fmt.Println(ipv6.String())
  267. fmt.Println(ipv4.String())
  268. // Output:
  269. // fc00::
  270. // 10.255.0.0
  271. }
  272. func ExampleIP_To16() {
  273. ipv6 := net.IP{0xfc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
  274. ipv4 := net.IPv4(10, 255, 0, 0)
  275. fmt.Println(ipv6.To16())
  276. fmt.Println(ipv4.To16())
  277. // Output:
  278. // fc00::
  279. // 10.255.0.0
  280. }
  281. func ExampleIP_to4() {
  282. ipv6 := net.IP{0xfc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
  283. ipv4 := net.IPv4(10, 255, 0, 0)
  284. fmt.Println(ipv6.To4())
  285. fmt.Println(ipv4.To4())
  286. // Output:
  287. // <nil>
  288. // 10.255.0.0
  289. }
  290. func ExampleCIDRMask() {
  291. // This mask corresponds to a /31 subnet for IPv4.
  292. fmt.Println(net.CIDRMask(31, 32))
  293. // This mask corresponds to a /64 subnet for IPv6.
  294. fmt.Println(net.CIDRMask(64, 128))
  295. // Output:
  296. // fffffffe
  297. // ffffffffffffffff0000000000000000
  298. }
  299. func ExampleIPv4Mask() {
  300. fmt.Println(net.IPv4Mask(255, 255, 255, 0))
  301. // Output:
  302. // ffffff00
  303. }
  304. func ExampleUDPConn_WriteTo() {
  305. // Unlike Dial, ListenPacket creates a connection without any
  306. // association with peers.
  307. conn, err := net.ListenPacket("udp", ":0")
  308. if err != nil {
  309. log.Fatal(err)
  310. }
  311. defer conn.Close()
  312. dst, err := net.ResolveUDPAddr("udp", "192.0.2.1:2000")
  313. if err != nil {
  314. log.Fatal(err)
  315. }
  316. // The connection can write data to the desired address.
  317. _, err = conn.WriteTo([]byte("data"), dst)
  318. if err != nil {
  319. log.Fatal(err)
  320. }
  321. }