golang tcp heartbeat
2016-03-20 18:01
423 查看
package main import "log" import "time" const TIMEOUT_NS = int64(30e9) // 30 seconds type Msg struct { Header uint8 // == 1 SeqNo uint32 Data uint8 // the real case is complex } type Reply struct { Header uint8 // == 2 SeqNo uint32 Status uint8 } type AskHeartBeat struct { Header uint8 // == 4 SeqNo uint32 } type ReplyHeartBeat struct { Header uint8 // == 4 SeqNo uint32 } type TCPCh chan interface{} // simulate TCP type CmdCh chan uint8 // 0:Quit 1:ask HB var gLastHBTime int64 // heartbeat time func Sender(tcp TCPCh, cS2R, cR2S, cQuit CmdCh) { var cmd uint8 seq := uint32(1) n := 10 // send 10 msgs L_LOOP: for { select { case cmd = <-cR2S: if cmd == 0 { break L_LOOP } if cmd == 1 { gLastHBTime = time.Nanoseconds() hbr := ReplyHeartBeat{5, seq} seq++ log.Println("S", hbr) tcp <- hbr } default: now := time.Nanoseconds() if now-gLastHBTime > TIMEOUT_NS { hb := &AskHeartBeat{4, seq} log.Println("S", hb) tcp <- hb seq++ } gLastHBTime = now if n < 0 { time.Sleep(20e9) // wait reply cS2R <- 0 // ask to quit break L_LOOP } n-- m := &Msg{1, seq, 0} seq++ log.Println("S", m) tcp <- m } } cQuit <- 0 } func Receiver(tcp TCPCh, cS2R, cR2S, cQuit CmdCh) { var v interface{} var cmd uint8 lastSeq := uint32(0) L_LOOP: for { select { case v = <-tcp: gLastHBTime = time.Nanoseconds() switch v.(type) { case Reply: r := v.(Reply) if lastSeq+1 != r.SeqNo { cR2S <- 0 // force sender quit } log.Println("R", r) case AskHeartBeat: r := v.(AskHeartBeat) if lastSeq+1 != r.SeqNo { cR2S <- 0 // force sender quit } log.Println("R", r) cR2S <- 1 // request send ReplyHeartBeat case ReplyHeartBeat: r := v.(ReplyHeartBeat) if lastSeq+1 != r.SeqNo { cR2S <- 1 // force sender quit } log.Println("R", r) } case cmd = <-cS2R: if cmd == 0 { break L_LOOP } } } cQuit <- 0 } func main() { cTCP := make(chan interface{}, 1024) cQuit := make(chan uint8, 2) cS2R := make(chan uint8) cR2S := make(chan uint8) gLastHBTime = time.Nanoseconds() go Sender(cTCP, cS2R, cR2S, cQuit) go Receiver(cTCP, cS2R, cR2S, cQuit) <-cQuit <-cQuit }
相关文章推荐
- Using TCP keepalive with Go
- Http同步和异步请求区别
- 【Java】Java网络编程TCP与UDP
- HTTP协议--学习笔记
- Android利用HttpClient发送Json到后台
- Socket 通信原理(Android客户端和服务器以TCP&&UDP方式互通)
- 浅谈HTTP中Get与Post的区别【转】
- IndiaHacks 2016 - Online Edition (Div. 1 + Div. 2) D. Delivery Bears 二分+网络流
- TCP:状态控制码
- 怎么理解RSA算法
- Http request传输图片和附属信息(old)
- TCP协议中的三次握手和四次挥手(图解)
- 访问一个网页过程中发生了什么
- 基于HttpClient的HttpUtils(后台访问URL)
- Http协议学习笔记
- 手写服务器httpserver_封装Response_封装Request_JAVA199-201
- Web后端语言模拟http请求(带用户名和密码)实例代码大全
- 网络流——SAP模板
- Spark性能优化第二季-Task、数据倾斜及网络性能优化
- 网络开发库从libuv说到epoll