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