wait_windows.go 551 B

12345678910111213141516171819202122232425262728
  1. package tf
  2. import (
  3. "context"
  4. "errors"
  5. "net"
  6. "time"
  7. "github.com/sagernet/sing/common/winiphlpapi"
  8. "golang.org/x/sys/windows"
  9. )
  10. func writeAndWaitAck(ctx context.Context, conn *net.TCPConn, payload []byte, fallbackDelay time.Duration) error {
  11. start := time.Now()
  12. err := winiphlpapi.WriteAndWaitAck(ctx, conn, payload)
  13. if err != nil {
  14. if errors.Is(err, windows.ERROR_ACCESS_DENIED) {
  15. time.Sleep(fallbackDelay)
  16. return nil
  17. }
  18. return err
  19. }
  20. if time.Since(start) <= 20*time.Millisecond {
  21. time.Sleep(fallbackDelay)
  22. }
  23. return nil
  24. }