...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package grpctransport
19
20 import (
21 "context"
22 "net"
23 "syscall"
24
25 "google.golang.org/grpc"
26 )
27
28 const (
29
30
31 tcpUserTimeoutMilliseconds = 20000
32
33
34 tcpUserTimeoutOp = 0x12
35 )
36
37 func init() {
38
39
40 timeoutDialerOption = grpc.WithContextDialer(dialTCPUserTimeout)
41 }
42
43 func dialTCPUserTimeout(ctx context.Context, addr string) (net.Conn, error) {
44 control := func(network, address string, c syscall.RawConn) error {
45 var syscallErr error
46 controlErr := c.Control(func(fd uintptr) {
47 syscallErr = syscall.SetsockoptInt(
48 int(fd), syscall.IPPROTO_TCP, tcpUserTimeoutOp, tcpUserTimeoutMilliseconds)
49 })
50 if syscallErr != nil {
51 return syscallErr
52 }
53 if controlErr != nil {
54 return controlErr
55 }
56 return nil
57 }
58 d := &net.Dialer{
59 Control: control,
60 }
61 return d.DialContext(ctx, "tcp", addr)
62 }
63
View as plain text