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

