Golang中TCP连接出现broken pipe错误的解决方法

Golang中TCP连接出现broken pipe错误的解决方法 我有一个使用 github.com/jlaffaye/ftp 库下载文件的 Go 应用程序,该库实现了文件传输协议(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
}

在它运行时尝试调用该处理程序将产生: "error":"already running"

另外,在从全局 Client 读取时,我使用了互斥锁,如下所示:

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

更多关于Golang中TCP连接出现broken pipe错误的解决方法的实战教程也可以访问 https://www.itying.com/category-94-b0.html

回到顶部