1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
|
// Copyright 2017 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package net
import (
"syscall"
"testing"
"unsafe"
)
func TestRawConn(t *testing.T) {
c, err := newLocalPacketListener("udp")
if err != nil {
t.Fatal(err)
}
defer c.Close()
cc, err := c.(*UDPConn).SyscallConn()
if err != nil {
t.Fatal(err)
}
var operr error
fn := func(s uintptr) {
operr = syscall.SetsockoptInt(syscall.Handle(s), syscall.SOL_SOCKET, syscall.SO_REUSEADDR, 1)
}
err = cc.Control(fn)
if err != nil || operr != nil {
t.Fatal(err, operr)
}
c.Close()
err = cc.Control(fn)
if err == nil {
t.Fatal("should fail")
}
}
func TestRawConnListener(t *testing.T) {
ln, err := newLocalListener("tcp")
if err != nil {
t.Fatal(err)
}
defer ln.Close()
cc, err := ln.(*TCPListener).SyscallConn()
if err != nil {
t.Fatal(err)
}
called := false
op := func(uintptr) bool {
called = true
return true
}
err = cc.Write(op)
if err == nil {
t.Error("Write should return an error")
}
if called {
t.Error("Write shouldn't call op")
}
called = false
err = cc.Read(op)
if err == nil {
t.Error("Read should return an error")
}
if called {
t.Error("Read shouldn't call op")
}
var operr error
fn := func(s uintptr) {
var v, l int32
l = int32(unsafe.Sizeof(v))
operr = syscall.Getsockopt(syscall.Handle(s), syscall.SOL_SOCKET, syscall.SO_REUSEADDR, (*byte)(unsafe.Pointer(&v)), &l)
}
err = cc.Control(fn)
if err != nil || operr != nil {
t.Fatal(err, operr)
}
ln.Close()
err = cc.Control(fn)
if err == nil {
t.Fatal("Control after Close should fail")
}
}
|