@@ -31,14 +31,14 @@ const (
31
31
32
32
const (
33
33
CmdConnect uint8 = 1
34
- CmdBind = 2
35
- CmdUdp = 3
34
+ CmdBind uint8 = 2
35
+ CmdUdp uint8 = 3
36
36
)
37
37
38
38
const (
39
39
AddrIPv4 uint8 = 1
40
- AddrDomain = 3
41
- AddrIPv6 = 4
40
+ AddrDomain uint8 = 3
41
+ AddrIPv6 uint8 = 4
42
42
)
43
43
44
44
const (
@@ -54,26 +54,33 @@ const (
54
54
)
55
55
56
56
var (
57
- ErrBadVersion = errors .New ("Bad version" )
58
- ErrBadFormat = errors .New ("Bad format" )
59
- ErrBadAddrType = errors .New ("Bad address type" )
60
- ErrShortBuffer = errors .New ("Short buffer" )
61
- ErrBadMethod = errors .New ("Bad method" )
62
- ErrAuthFailure = errors .New ("Auth failure" )
57
+ ErrBadVersion = errors .New ("bad version" )
58
+ ErrBadFormat = errors .New ("bad format" )
59
+ ErrBadAddrType = errors .New ("bad address type" )
60
+ ErrShortBuffer = errors .New ("short buffer" )
61
+ ErrBadMethod = errors .New ("bad method" )
62
+ ErrAuthFailure = errors .New ("auth failure" )
63
+ )
64
+
65
+ var (
66
+ SmallPoolSize = 1024
67
+ LargePoolSize = 16 * 1024
63
68
)
64
69
65
70
// buffer pools
66
71
var (
72
+ // small buff pool
67
73
sPool = sync.Pool {
68
74
New : func () interface {} {
69
- return make ([]byte , 576 )
75
+ return make ([]byte , SmallPoolSize )
70
76
},
71
- } // small buff pool
77
+ }
78
+ // large buff pool for udp
72
79
lPool = sync.Pool {
73
80
New : func () interface {} {
74
- return make ([]byte , 64 * 1024 + 262 )
81
+ return make ([]byte , LargePoolSize )
75
82
},
76
- } // large buff pool for udp
83
+ }
77
84
)
78
85
79
86
/*
@@ -300,28 +307,67 @@ func NewAddr(sa string) (addr *Addr, err error) {
300
307
return
301
308
}
302
309
303
- func (addr * Addr ) Decode (b []byte ) error {
310
+ func (addr * Addr ) ReadFrom (r io.Reader ) (n int64 , err error ) {
311
+ b := sPool .Get ().([]byte )
312
+ defer sPool .Put (b )
313
+
314
+ _ , err = io .ReadFull (r , b [:1 ])
315
+ if err != nil {
316
+ return
317
+ }
304
318
addr .Type = b [0 ]
305
- pos := 1
319
+ n ++
320
+
306
321
switch addr .Type {
307
322
case AddrIPv4 :
308
- addr .Host = net .IP (b [pos : pos + net .IPv4len ]).String ()
309
- pos += net .IPv4len
323
+ _ , err = io .ReadFull (r , b [:net .IPv4len ])
324
+ addr .Host = net .IP (b [:net .IPv4len ]).String ()
325
+ n += net .IPv4len
310
326
case AddrIPv6 :
311
- addr .Host = net .IP (b [pos : pos + net .IPv6len ]).String ()
312
- pos += net .IPv6len
327
+ _ , err = io .ReadFull (r , b [:net .IPv6len ])
328
+ addr .Host = net .IP (b [:net .IPv6len ]).String ()
329
+ n += net .IPv6len
313
330
case AddrDomain :
314
- addrlen := int (b [pos ])
315
- pos ++
316
- addr .Host = string (b [pos : pos + addrlen ])
317
- pos += addrlen
331
+ if _ , err = io .ReadFull (r , b [:1 ]); err != nil {
332
+ return
333
+ }
334
+ addrlen := int (b [0 ])
335
+ n ++
336
+
337
+ _ , err = io .ReadFull (r , b [:addrlen ])
338
+ addr .Host = string (b [:addrlen ])
339
+ n += int64 (addrlen )
318
340
default :
319
- return ErrBadAddrType
341
+ err = ErrBadAddrType
342
+ return
343
+ }
344
+ if err != nil {
345
+ return
320
346
}
321
347
322
- addr .Port = binary .BigEndian .Uint16 (b [pos :])
348
+ _ , err = io .ReadFull (r , b [:2 ])
349
+ addr .Port = binary .BigEndian .Uint16 (b [:2 ])
350
+ n += 2
323
351
324
- return nil
352
+ return
353
+ }
354
+
355
+ func (addr * Addr ) WriteTo (w io.Writer ) (int64 , error ) {
356
+ b := sPool .Get ().([]byte )
357
+ defer sPool .Put (b )
358
+
359
+ nn , err := addr .Encode (b )
360
+ if err != nil {
361
+ return int64 (nn ), err
362
+ }
363
+
364
+ nn , err = w .Write (b )
365
+ return int64 (nn ), err
366
+ }
367
+
368
+ func (addr * Addr ) Decode (b []byte ) error {
369
+ _ , err := addr .ReadFrom (bytes .NewReader (b ))
370
+ return err
325
371
}
326
372
327
373
func (addr * Addr ) Encode (b []byte ) (int , error ) {
@@ -334,20 +380,20 @@ func (addr *Addr) Encode(b []byte) (int, error) {
334
380
ip4 = net .IPv4zero .To4 ()
335
381
}
336
382
pos += copy (b [pos :], ip4 )
337
- case AddrDomain :
338
- b [pos ] = byte (len (addr .Host ))
339
- pos ++
340
- pos += copy (b [pos :], []byte (addr .Host ))
341
383
case AddrIPv6 :
342
384
ip16 := net .ParseIP (addr .Host ).To16 ()
343
385
if ip16 == nil {
344
386
ip16 = net .IPv6zero .To16 ()
345
387
}
346
388
pos += copy (b [pos :], ip16 )
389
+ case AddrDomain :
390
+ b [pos ] = byte (len (addr .Host ))
391
+ pos ++
392
+ pos += copy (b [pos :], []byte (addr .Host ))
347
393
default :
348
394
b [0 ] = AddrIPv4
349
- copy (b [pos :pos + 4 ], net .IPv4zero .To4 ())
350
- pos += 4
395
+ copy (b [pos :pos + net . IPv4len ], net .IPv4zero .To4 ())
396
+ pos += net . IPv4len
351
397
}
352
398
binary .BigEndian .PutUint16 (b [pos :], addr .Port )
353
399
pos += 2
0 commit comments