gpt4 book ai didi

tcp - 在 Go 中的 EOF 上重新连接 TCP

转载 作者:IT王子 更新时间:2023-10-29 01:26:08 29 4
gpt4 key购买 nike

我有以下内容:

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

然后两个函数:

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)
}
}

其中 ReadLogStash 是一个正在运行的 goroutine。如果对方关闭,我得到 EOF。在 ReadLogStash 中有什么好的实现可以让它在收到 EOF 时每隔 X 秒尝试重新建立连接?

最佳答案

Go 有用于同步和通信的 channel ,使用它们吧!

在一个循环中建立你的连接,并让它等待某种消息在 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
}

除非您在 ReadLogStash 中有更多功能,否则您可能只使用 io.Copy 内联,而忘记整个函数,但无论如何这种模式可能对您有用。

关于tcp - 在 Go 中的 EOF 上重新连接 TCP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23395519/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com