/
socket.go
126 lines (99 loc) · 2.78 KB
/
socket.go
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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
package pasnet // import "github.com/nathanaelle/pasnet"
import (
"net"
"time"
"syscall"
)
const (
LINGER_TIMEOUT time.Duration = 3 *time.Second
KA_INTERVAL time.Duration = 5 *time.Second
KA_IDLE time.Duration = 10*time.Second
KA_COUNT int = 10
)
func system_listener(net string, laddr *net.TCPAddr) (fd int, err error) {
switch {
case laddr.IP.To4() != nil:
var addr [4]byte
copy(addr[:], laddr.IP[len(laddr.IP)-4:len(laddr.IP)] )
return listener_tcp_( tcp4_socket,
func(fd int) error{
return syscall.Bind(fd, &syscall.SockaddrInet4{Port: laddr.Port, Addr: addr })
})
case laddr.IP.To16() != nil:
var addr [16]byte
copy(addr[:], laddr.IP )
return listener_tcp_( tcp6_socket,
func(fd int) error{
return syscall.Bind(fd, &syscall.SockaddrInet6{Port: laddr.Port, Addr: addr })
})
default:
return -1, &E_UnknownProto{net}
}
}
func listener_tcp_( generic_create func() (int,error), generic_bind func(int) error) (fd int, err error){
if fd, err = generic_create(); err != nil {
return -1, err
}
err = gatling(
bullet(so_reuseaddr , true ),
bullet(so_reuseport , true ),
bullet(so_fastopen , 10 ),
bullet(ka_idle , KA_IDLE ),
bullet(ka_intvl , KA_INTERVAL ),
bullet(ka_count , KA_COUNT ),
bullet(so_linger , LINGER_TIMEOUT),
bullet(generic_bind , nil ),
bullet(so_listen , -1 ),
bullet(so_nodelay , true ),
bullet(so_tcpcork , false ),
bullet(so_tcpnopush , false ),
bullet(so_nonblock , true ),
)( fd )
if err != nil {
syscall.Close(fd)
return -1, err
}
return
}
func system_dialer(net string, laddr *net.TCPAddr) (fd int, err error) {
switch {
case laddr.IP.To4() != nil:
var addr [4]byte
copy(addr[:], laddr.IP[len(laddr.IP)-4:len(laddr.IP)] )
return dialer_tcp_( tcp4_socket,
func(fd int) error{
return syscall.Connect(fd, &syscall.SockaddrInet4{Port: laddr.Port, Addr: addr })
})
case laddr.IP.To16() != nil:
var addr [16]byte
copy(addr[:], laddr.IP )
return dialer_tcp_( tcp6_socket,
func(fd int) error{
return syscall.Connect(fd, &syscall.SockaddrInet6{Port: laddr.Port, Addr: addr })
})
}
return -1, &E_UnknownProto{net}
}
func dialer_tcp_( generic_create func() (int,error), generic_connect func(int) error) (fd int, err error){
if fd, err = generic_create(); err != nil {
return -1, err
}
err = gatling(
bullet(ka_idle , KA_IDLE ),
bullet(ka_intvl , KA_INTERVAL ),
bullet(ka_count , KA_COUNT ),
bullet(so_linger , LINGER_TIMEOUT),
bullet(generic_connect , nil ),
bullet(so_rcvbuf , 1<<16 ),
bullet(so_sndbuf , 1<<16 ),
bullet(so_nodelay , true ),
bullet(so_tcpcork , false ),
bullet(so_tcpnopush , false ),
bullet(so_nonblock , true ),
)( fd )
if err != nil {
syscall.Close(fd)
return -1, err
}
return
}