登录
首页 >  Golang >  Go问答

程序失败并显示:写入 tcp 管道损坏错误

来源:stackoverflow

时间:2024-04-08 12:18:35 437浏览 收藏

IT行业相对于一般传统行业,发展更新速度更快,一旦停止了学习,很快就会被行业所淘汰。所以我们需要踏踏实实的不断学习,精进自己的技术,尤其是初学者。今天golang学习网给大家整理了《程序失败并显示:写入 tcp 管道损坏错误》,聊聊,我们一起来看看吧!

问题内容

我有一个 go 应用程序,可以使用 github.com/jlaffaye/ftp 下载文件,这是一个实现文件传输协议 (ftp) 的库

定义了一个带有 ftp 连接的结构体

type client struct {
    conn *ftp.serverconn
    sync.mutex
}

我有一个全球客户

var cli *client = nil

然后我将其初始化并分配给稍后使用的全局变量

conn, err := ftp.dial(cfg.host+cfg.port, ftp.dialwithcontext(ctx))
    if err != nil {
        return fmt.errorf("ftp dial error: %v", err)
    }

    err = conn.login(cfg.username, pwd)
    if err != nil {
        return fmt.errorf("ftp login error: %v", err)
    }

    c := &client{}

    c.lock()
    c.conn = conn
    cli = c
    c.unlock()

我有一个 http 处理程序,它从 client 结构中获取 conn 字段并调用

filenames, err := conn.namelist(".")
    if err != nil {
        return err
    }

大多数时候,应用程序在调用 conn.namelist(".") 时失败,并出现错误

write tcp xxx.xxx.xx.x:48572-\u003exx.xxx.xxx.xxx:21: write: broken pipe

有时

write tcp xxx.xxx.xx.xx:63037-\u003exx.xxx.xxx.xxx:21: wsasend: an established connection was aborted by the software in your host machine

我不会过早关闭连接。 有谁知道为什么会发生这种情况?或者也许您可以推荐一个更好的使用 ftp 的库?

根据多个服务是否同时运行以及是否同时安全的问题。

当一个进程正在运行时,另一个进程无法运行,直到调用 setisrunning(false)

func (s *service) setisrunning(b bool) error {
    mu := &sync.mutex{}
    mu.lock()
    defer mu.unlock()

    if b && s.isrunning {
        return errors.new("already running")
    }
    s.isrunning = b

    return nil
}

尝试在运行时调用该处理程序将产生 “错误”:“已经运行”

此外,我在从全局 client 读取数据时使用互斥锁,如下所示

cli.Lock()
    conn = cli.conn
    cli.Unlock()

正确答案


切换到非全局客户端可以解决问题

今天关于《程序失败并显示:写入 tcp 管道损坏错误》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>