Skip to content

Commit 6d1f4b3

Browse files
committed
add tcp_keepalive config for tcp option SO_KEEPALIVE
1 parent e1c2935 commit 6d1f4b3

File tree

5 files changed

+63
-9
lines changed

5 files changed

+63
-9
lines changed

config.go

+2
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ type Config struct {
3333
RedisMQSize int `json:"redis_mqsize"`
3434
MaxProcs int `json:"max_procs"`
3535
MaxSubscriberPerKey int `json:"max_subscriber_per_key"`
36+
TCPKeepAlive int `json:"tcp_keepalive"`
3637
}
3738

3839
func InitConfig(file string) (*Config, error) {
@@ -60,6 +61,7 @@ func InitConfig(file string) (*Config, error) {
6061
RedisMQSize: 20,
6162
MaxSubscriberPerKey: 0, // no limit
6263
MaxProcs: runtime.NumCPU(),
64+
TCPKeepAlive: 1,
6365
}
6466
if err = json.Unmarshal(c, cf); err != nil {
6567
Log.Printf("json.Unmarshal(\"%s\", cf) failed (%s)", string(c), err.Error())

gopush.conf

+2-1
Original file line numberDiff line numberDiff line change
@@ -15,5 +15,6 @@
1515
"redis_poolsize": 50,
1616
"redis_mqsize": 20,
1717
"max_procs": 4,
18-
"max_subscriber_per_key": 3
18+
"max_subscriber_per_key": 3,
19+
"tcp_keepalive": 1
1920
}

listen.go

+53
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
"net"
6+
"net/http"
7+
)
8+
9+
type KeepAliveListener struct {
10+
net.Listener
11+
}
12+
13+
func (l *KeepAliveListener) Accept() (c net.Conn, err error) {
14+
c, err = l.Listener.Accept()
15+
if err != nil {
16+
Log.Printf("Listener.Accept() failed (%s)", err.Error())
17+
return
18+
}
19+
20+
// set keepalive
21+
if tc, ok := c.(*net.TCPConn); !ok {
22+
panic("Assection type failed c.(net.TCPConn)")
23+
} else {
24+
err = tc.SetKeepAlive(true)
25+
if err != nil {
26+
Log.Printf("tc.SetKeepAlive(true) failed (%s)", err.Error())
27+
return
28+
}
29+
}
30+
31+
return
32+
}
33+
34+
func Listen() error {
35+
addr := fmt.Sprintf("%s:%d", Conf.Addr, Conf.Port)
36+
if Conf.TCPKeepAlive == 1 {
37+
server := &http.Server{}
38+
l, err := net.Listen("tcp", addr)
39+
if err != nil {
40+
Log.Printf("net.Listen(\"tcp\", \"%s\") failed (%s)", addr, err.Error())
41+
return err
42+
}
43+
44+
return server.Serve(&KeepAliveListener{Listener: l})
45+
} else {
46+
if err := http.ListenAndServe(addr, nil); err != nil {
47+
Log.Printf("http.ListenAdServe(\"%s\") failed (%s)", addr, err.Error())
48+
return err
49+
}
50+
}
51+
// nerve here
52+
return nil
53+
}

main.go

+2-4
Original file line numberDiff line numberDiff line change
@@ -80,10 +80,8 @@ func main() {
8080
http.HandleFunc("/pub", Publish)
8181
}
8282
// start listen and pending here
83-
if err := http.ListenAndServe(fmt.Sprintf("%s:%d", Conf.Addr, Conf.Port), nil); err != nil {
84-
Log.Printf("http.ListenAdServe(\"%s:%d\") failed (%s)", Conf.Addr, Conf.Port, err.Error())
83+
if err = Listen(); err != nil {
84+
Log.Printf("Listen() failed (%s)", err.Error())
8585
return
8686
}
87-
88-
Log.Printf("gopush service exit.")
8987
}

push.go

+4-4
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,9 @@ const (
2222
)
2323

2424
var (
25-
errMsg = map[int]string{}
26-
pusher Pusher
27-
protocolErr = errors.New("client must not send any data")
25+
errMsg = map[int]string{}
26+
pusher Pusher
27+
protocolErr = errors.New("client must not send any data")
2828
)
2929

3030
type Pusher interface {
@@ -109,7 +109,7 @@ func Subscribe(ws *websocket.Conn) {
109109
return
110110
}
111111
// Generate Key
112-
key = pusher.Key(key)
112+
key = pusher.Key(key)
113113
Log.Printf("Client (%s) subscribe to key %s", ws.Request().RemoteAddr, key)
114114
// check multi cli connected
115115
if Conf.MaxSubscriberPerKey > 0 {

0 commit comments

Comments
 (0)