tcpsock_windows.mx raw

   1  // Copyright 2023 The Go Authors. All rights reserved.
   2  // Use of this source code is governed by a BSD-style
   3  // license that can be found in the LICENSE file.
   4  
   5  package net
   6  
   7  import (
   8  	"internal/syscall/windows"
   9  	"syscall"
  10  )
  11  
  12  // SetKeepAliveConfig configures keep-alive messages sent by the operating system.
  13  func (c *TCPConn) SetKeepAliveConfig(config KeepAliveConfig) error {
  14  	if !c.ok() {
  15  		return syscall.EINVAL
  16  	}
  17  
  18  	if err := setKeepAlive(c.fd, config.Enable); err != nil {
  19  		return &OpError{Op: "set", Net: c.fd.net, Source: c.fd.laddr, Addr: c.fd.raddr, Err: err}
  20  	}
  21  	if windows.SupportTCPKeepAliveIdle() && windows.SupportTCPKeepAliveInterval() {
  22  		if err := setKeepAliveIdle(c.fd, config.Idle); err != nil {
  23  			return &OpError{Op: "set", Net: c.fd.net, Source: c.fd.laddr, Addr: c.fd.raddr, Err: err}
  24  		}
  25  		if err := setKeepAliveInterval(c.fd, config.Interval); err != nil {
  26  			return &OpError{Op: "set", Net: c.fd.net, Source: c.fd.laddr, Addr: c.fd.raddr, Err: err}
  27  		}
  28  	} else if err := setKeepAliveIdleAndInterval(c.fd, config.Idle, config.Interval); err != nil {
  29  		return &OpError{Op: "set", Net: c.fd.net, Source: c.fd.laddr, Addr: c.fd.raddr, Err: err}
  30  	}
  31  	if err := setKeepAliveCount(c.fd, config.Count); err != nil {
  32  		return &OpError{Op: "set", Net: c.fd.net, Source: c.fd.laddr, Addr: c.fd.raddr, Err: err}
  33  	}
  34  
  35  	return nil
  36  }
  37