|
@@ -155,14 +155,50 @@ func SaveData(path string, parameter interface{}) error {
|
|
|
return nil
|
|
|
}
|
|
|
|
|
|
-// WriteDevice 纯写
|
|
|
+const (
|
|
|
+ maxRetries = 3 // 最大重试次数
|
|
|
+ writeTimeout = 5 * time.Second // 写入超时时间
|
|
|
+)
|
|
|
+
|
|
|
func WriteDevice(frame []byte, conn net.Conn) error {
|
|
|
- _, err := conn.Write(frame)
|
|
|
- if err != nil {
|
|
|
- logger.Get().Errorln("Error writing to connection:", err)
|
|
|
- return err
|
|
|
+ for attempts := 0; attempts < maxRetries; attempts++ {
|
|
|
+ if err := conn.SetWriteDeadline(time.Now().Add(writeTimeout)); err != nil {
|
|
|
+ logger.Get().Errorf("Set write deadline failed: %v", err)
|
|
|
+ return err
|
|
|
+ }
|
|
|
+
|
|
|
+ _, err := conn.Write(frame)
|
|
|
+ if err == nil {
|
|
|
+ logger.Get().Infof("Successfully wrote frame to device")
|
|
|
+ return nil
|
|
|
+ }
|
|
|
+
|
|
|
+ // 检查是否是 broken pipe 或 connection reset by peer 错误
|
|
|
+ if ne, ok := err.(*net.OpError); ok && (ne.Err.Error() == "broken pipe" || ne.Err.Error() == "connection reset by peer") {
|
|
|
+ logger.Get().Warnf("Connection closed by peer or broken pipe, retrying (%d/%d)", attempts+1, maxRetries)
|
|
|
+
|
|
|
+ // 关闭旧连接
|
|
|
+ if err := conn.Close(); err != nil {
|
|
|
+ logger.Get().Errorf("Failed to close connection: %v", err)
|
|
|
+ }
|
|
|
+
|
|
|
+ // 尝试重新建立连接
|
|
|
+ var newConn net.Conn
|
|
|
+ newConn, err = net.Dial("tcp", conn.RemoteAddr().String())
|
|
|
+ if err != nil {
|
|
|
+ logger.Get().Errorf("Reconnect failed: %v", err)
|
|
|
+ continue // 继续下一次重试
|
|
|
+ }
|
|
|
+ conn = newConn
|
|
|
+ continue // 重试写入
|
|
|
+ }
|
|
|
+
|
|
|
+ // 如果不是 broken pipe 或 connection reset by peer,则直接返回错误
|
|
|
+ logger.Get().Errorf("Write failed: %v", err)
|
|
|
+ return fmt.Errorf("write failed after %d retries: %v", attempts+1, err)
|
|
|
}
|
|
|
- return nil
|
|
|
+
|
|
|
+ return fmt.Errorf("failed to write after %d retries", maxRetries)
|
|
|
}
|
|
|
|
|
|
func WriteAndReadDevice(frame []byte, conn net.Conn, former, after int) (data []byte, err error) {
|