2025-05-26 16:37:54 +08:00
|
|
|
package utils
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"errors"
|
|
|
|
|
"fmt"
|
|
|
|
|
"io"
|
|
|
|
|
"net"
|
|
|
|
|
"syscall"
|
|
|
|
|
)
|
|
|
|
|
|
2025-05-27 18:53:01 +08:00
|
|
|
func WarpConnErr(err error) (bool, error) {
|
2025-05-26 16:37:54 +08:00
|
|
|
if err == nil {
|
2025-05-27 18:53:01 +08:00
|
|
|
return true, nil
|
2025-05-26 16:37:54 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var opErr *net.OpError
|
|
|
|
|
switch {
|
|
|
|
|
|
|
|
|
|
case errors.Is(err, net.ErrClosed):
|
2025-05-29 14:44:06 +08:00
|
|
|
return true, errors.New("连接已关闭")
|
2025-05-26 16:37:54 +08:00
|
|
|
case errors.Is(err, io.EOF):
|
2025-05-29 14:44:06 +08:00
|
|
|
return true, errors.New("连接已结束")
|
2025-05-26 16:37:54 +08:00
|
|
|
|
|
|
|
|
case errors.As(err, &opErr):
|
|
|
|
|
switch {
|
|
|
|
|
case
|
|
|
|
|
errors.Is(opErr.Err, syscall.WSAECONNRESET), errors.Is(opErr.Err, syscall.WSAECONNABORTED),
|
|
|
|
|
errors.Is(opErr.Err, syscall.ECONNRESET), errors.Is(opErr.Err, syscall.ECONNABORTED):
|
2025-05-29 14:44:06 +08:00
|
|
|
return false, errors.New("连接已重置或中止")
|
2025-05-26 16:37:54 +08:00
|
|
|
case opErr.Timeout():
|
2025-05-29 14:44:06 +08:00
|
|
|
return false, errors.New("连接已超时")
|
2025-05-26 16:37:54 +08:00
|
|
|
}
|
|
|
|
|
}
|
2025-05-27 18:53:01 +08:00
|
|
|
return false, fmt.Errorf("连接发生未处理的错误: %w", err)
|
2025-05-26 16:37:54 +08:00
|
|
|
}
|