Source file
src/net/iprawsock.go
1
2
3
4
5 package net
6
7 import (
8 "context"
9 "syscall"
10 )
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 type IPAddr struct {
29 IP IP
30 Zone string
31 }
32
33
34 func (a *IPAddr) Network() string { return "ip" }
35
36 func (a *IPAddr) String() string {
37 if a == nil {
38 return "<nil>"
39 }
40 ip := ipEmptyString(a.IP)
41 if a.Zone != "" {
42 return ip + "%" + a.Zone
43 }
44 return ip
45 }
46
47 func (a *IPAddr) isWildcard() bool {
48 if a == nil || a.IP == nil {
49 return true
50 }
51 return a.IP.IsUnspecified()
52 }
53
54 func (a *IPAddr) opAddr() Addr {
55 if a == nil {
56 return nil
57 }
58 return a
59 }
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74 func ResolveIPAddr(network, address string) (*IPAddr, error) {
75 if network == "" {
76 network = "ip"
77 }
78 afnet, _, err := parseNetwork(context.Background(), network, false)
79 if err != nil {
80 return nil, err
81 }
82 switch afnet {
83 case "ip", "ip4", "ip6":
84 default:
85 return nil, UnknownNetworkError(network)
86 }
87 addrs, err := DefaultResolver.internetAddrList(context.Background(), afnet, address)
88 if err != nil {
89 return nil, err
90 }
91 return addrs.forResolve(network, address).(*IPAddr), nil
92 }
93
94
95
96 type IPConn struct {
97 conn
98 }
99
100
101
102 func (c *IPConn) SyscallConn() (syscall.RawConn, error) {
103 if !c.ok() {
104 return nil, syscall.EINVAL
105 }
106 return newRawConn(c.fd), nil
107 }
108
109
110 func (c *IPConn) ReadFromIP(b []byte) (int, *IPAddr, error) {
111 if !c.ok() {
112 return 0, nil, syscall.EINVAL
113 }
114 n, addr, err := c.readFrom(b)
115 if err != nil {
116 err = &OpError{Op: "read", Net: c.fd.net, Source: c.fd.laddr, Addr: c.fd.raddr, Err: err}
117 }
118 return n, addr, err
119 }
120
121
122 func (c *IPConn) ReadFrom(b []byte) (int, Addr, error) {
123 if !c.ok() {
124 return 0, nil, syscall.EINVAL
125 }
126 n, addr, err := c.readFrom(b)
127 if err != nil {
128 err = &OpError{Op: "read", Net: c.fd.net, Source: c.fd.laddr, Addr: c.fd.raddr, Err: err}
129 }
130 if addr == nil {
131 return n, nil, err
132 }
133 return n, addr, err
134 }
135
136
137
138
139
140
141
142
143 func (c *IPConn) ReadMsgIP(b, oob []byte) (n, oobn, flags int, addr *IPAddr, err error) {
144 if !c.ok() {
145 return 0, 0, 0, nil, syscall.EINVAL
146 }
147 n, oobn, flags, addr, err = c.readMsg(b, oob)
148 if err != nil {
149 err = &OpError{Op: "read", Net: c.fd.net, Source: c.fd.laddr, Addr: c.fd.raddr, Err: err}
150 }
151 return
152 }
153
154
155 func (c *IPConn) WriteToIP(b []byte, addr *IPAddr) (int, error) {
156 if !c.ok() {
157 return 0, syscall.EINVAL
158 }
159 n, err := c.writeTo(b, addr)
160 if err != nil {
161 err = &OpError{Op: "write", Net: c.fd.net, Source: c.fd.laddr, Addr: addr.opAddr(), Err: err}
162 }
163 return n, err
164 }
165
166
167 func (c *IPConn) WriteTo(b []byte, addr Addr) (int, error) {
168 if !c.ok() {
169 return 0, syscall.EINVAL
170 }
171 a, ok := addr.(*IPAddr)
172 if !ok {
173 return 0, &OpError{Op: "write", Net: c.fd.net, Source: c.fd.laddr, Addr: addr, Err: syscall.EINVAL}
174 }
175 n, err := c.writeTo(b, a)
176 if err != nil {
177 err = &OpError{Op: "write", Net: c.fd.net, Source: c.fd.laddr, Addr: a.opAddr(), Err: err}
178 }
179 return n, err
180 }
181
182
183
184
185
186
187
188 func (c *IPConn) WriteMsgIP(b, oob []byte, addr *IPAddr) (n, oobn int, err error) {
189 if !c.ok() {
190 return 0, 0, syscall.EINVAL
191 }
192 n, oobn, err = c.writeMsg(b, oob, addr)
193 if err != nil {
194 err = &OpError{Op: "write", Net: c.fd.net, Source: c.fd.laddr, Addr: addr.opAddr(), Err: err}
195 }
196 return
197 }
198
199 func newIPConn(fd *netFD) *IPConn { return &IPConn{conn{fd}} }
200
201
202
203
204
205
206
207
208 func DialIP(network string, laddr, raddr *IPAddr) (*IPConn, error) {
209 if raddr == nil {
210 return nil, &OpError{Op: "dial", Net: network, Source: laddr.opAddr(), Addr: nil, Err: errMissingAddress}
211 }
212 sd := &sysDialer{network: network, address: raddr.String()}
213 c, err := sd.dialIP(context.Background(), laddr, raddr)
214 if err != nil {
215 return nil, &OpError{Op: "dial", Net: network, Source: laddr.opAddr(), Addr: raddr.opAddr(), Err: err}
216 }
217 return c, nil
218 }
219
220
221
222
223
224
225
226
227 func ListenIP(network string, laddr *IPAddr) (*IPConn, error) {
228 if laddr == nil {
229 laddr = &IPAddr{}
230 }
231 sl := &sysListener{network: network, address: laddr.String()}
232 c, err := sl.listenIP(context.Background(), laddr)
233 if err != nil {
234 return nil, &OpError{Op: "listen", Net: network, Source: nil, Addr: laddr.opAddr(), Err: err}
235 }
236 return c, nil
237 }
238
View as plain text