utils.go 846 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. package server
  2. import (
  3. "context"
  4. "errors"
  5. "net"
  6. "sync"
  7. "time"
  8. )
  9. // 尝试连接到 address, 连接成功后不会发送任何数据
  10. func pingServer(ctx context.Context, address string) error {
  11. dialer := net.Dialer{
  12. Timeout: 2*time.Second,
  13. }
  14. conn, err := dialer.DialContext(ctx, "tcp", address)
  15. if err != nil {
  16. return err
  17. }
  18. _ = conn.Close()
  19. return nil
  20. }
  21. // ConnectTest 尝试连接服务器是否连通
  22. func ConnectTest(ctx context.Context, servers []string) error {
  23. errs := make(chan error, len(servers))
  24. var wg sync.WaitGroup
  25. wg.Add(len(servers))
  26. for _, server := range servers {
  27. wg.Go(func() {
  28. if err := pingServer(ctx, server); err != nil {
  29. errs <- err
  30. }
  31. wg.Done()
  32. })
  33. }
  34. wg.Wait()
  35. close(errs)
  36. var retErr error
  37. for err := range errs {
  38. retErr = errors.Join(retErr, err)
  39. }
  40. return retErr
  41. }