wait_windows.go 621 B

12345678910111213141516171819202122232425262728293031
  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. if _, err := conn.Write(payload); err != nil {
  16. return err
  17. }
  18. time.Sleep(fallbackDelay)
  19. return nil
  20. }
  21. return err
  22. }
  23. if time.Since(start) <= 20*time.Millisecond {
  24. time.Sleep(fallbackDelay)
  25. }
  26. return nil
  27. }