ds000001 2014-04-30 18:31
浏览 286
已采纳

在Go中的EOF上重新连接TCP

I have the following:

    //In an init func
    if logStashHost != "" {
        lsconn, err = net.Dial("tcp", logStashHost)
    }
    ...
    ToLogStash(rec, lsconn)

Then Two functions:

func ReadLogStash(conn net.Conn) {
    buffer := make([]byte, 256)
    for {
        _, err := conn.Read(buffer)
        if err != nil {
            fmt.Println(err)
        } else {
            fmt.Println(buffer)
        }
    }
}

func ToLogStash(r *logrow.Record, conn net.Conn) {
    b, err := json.Marshal(r)
    if err != nil {
        fmt.Println(err)
        return
    }
    _, err = fmt.Fprintln(conn, string(b))
    if err != nil {
        fmt.Println(err)
    }
}

Where ReadLogStash is a running goroutine. If the other side closes, I get EOF. What would be a good implementation in ReadLogStash to have it attempt to reestablish the connection every X seconds when it gets an EOF?

  • 写回答

2条回答 默认 最新

  • douqin1932 2014-04-30 19:23
    关注

    Go has channels for synchronization and communication, use them!

    Make your connection in a loop, and have it wait for some sort of message to come back on a channel.

    ...
    errCh := make(chan error)
    for {
        lsconn, err = net.Dial("tcp", logStashHost)
        // check error!
        go ReadLogStash(lsconn, errCh)
        err = <-errCh
        if err != nil {
            // bad error
            break
        }
        // sleep to backoff on retries?
    }
    ...
    
    func ReadLogStash(conn net.Conn, errCh chan error) {
        _, err := io.Copy(os.Stderr, conn)
        if err != nil {
            fmt.Println(err)
        }
        // a nil error from io.Copy means you reached EOF.
        errCh <- err
    }
    

    Unless you have more functionality in ReadLogStash, you can probably just use io.Copy inline, and forget the entire function, but this pattern may come in useful for you anyway.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来