sockopt_windows.go 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. package internet
  2. import (
  3. "syscall"
  4. "golang.org/x/sys/windows"
  5. )
  6. const (
  7. TCP_FASTOPEN = 15 // nolint: revive,stylecheck
  8. )
  9. func setTFO(fd syscall.Handle, settings SocketConfig_TCPFastOpenState) error {
  10. switch settings {
  11. case SocketConfig_Enable:
  12. if err := syscall.SetsockoptInt(fd, syscall.IPPROTO_TCP, TCP_FASTOPEN, 1); err != nil {
  13. return err
  14. }
  15. case SocketConfig_Disable:
  16. if err := syscall.SetsockoptInt(fd, syscall.IPPROTO_TCP, TCP_FASTOPEN, 0); err != nil {
  17. return err
  18. }
  19. }
  20. return nil
  21. }
  22. func applyOutboundSocketOptions(network string, address string, fd uintptr, config *SocketConfig) error {
  23. if isTCPSocket(network) {
  24. if err := setTFO(syscall.Handle(fd), config.Tfo); err != nil {
  25. return err
  26. }
  27. if config.TcpKeepAliveIdle > 0 {
  28. if err := syscall.SetsockoptInt(syscall.Handle(fd), syscall.SOL_SOCKET, syscall.SO_KEEPALIVE, 1); err != nil {
  29. return newError("failed to set SO_KEEPALIVE", err)
  30. }
  31. }
  32. }
  33. if config.TxBufSize != 0 {
  34. if err := windows.SetsockoptInt(windows.Handle(fd), windows.SOL_SOCKET, windows.SO_SNDBUF, int(config.TxBufSize)); err != nil {
  35. return newError("failed to set SO_SNDBUF").Base(err)
  36. }
  37. }
  38. if config.RxBufSize != 0 {
  39. if err := windows.SetsockoptInt(windows.Handle(fd), windows.SOL_SOCKET, windows.SO_RCVBUF, int(config.TxBufSize)); err != nil {
  40. return newError("failed to set SO_RCVBUF").Base(err)
  41. }
  42. }
  43. return nil
  44. }
  45. func applyInboundSocketOptions(network string, fd uintptr, config *SocketConfig) error {
  46. if isTCPSocket(network) {
  47. if err := setTFO(syscall.Handle(fd), config.Tfo); err != nil {
  48. return err
  49. }
  50. if config.TcpKeepAliveIdle > 0 {
  51. if err := syscall.SetsockoptInt(syscall.Handle(fd), syscall.SOL_SOCKET, syscall.SO_KEEPALIVE, 1); err != nil {
  52. return newError("failed to set SO_KEEPALIVE", err)
  53. }
  54. }
  55. }
  56. if config.TxBufSize != 0 {
  57. if err := windows.SetsockoptInt(windows.Handle(fd), windows.SOL_SOCKET, windows.SO_SNDBUF, int(config.TxBufSize)); err != nil {
  58. return newError("failed to set SO_SNDBUF").Base(err)
  59. }
  60. }
  61. if config.RxBufSize != 0 {
  62. if err := windows.SetsockoptInt(windows.Handle(fd), windows.SOL_SOCKET, windows.SO_RCVBUF, int(config.TxBufSize)); err != nil {
  63. return newError("failed to set SO_RCVBUF").Base(err)
  64. }
  65. }
  66. return nil
  67. }
  68. func bindAddr(fd uintptr, ip []byte, port uint32) error {
  69. return nil
  70. }
  71. func setReuseAddr(fd uintptr) error {
  72. return nil
  73. }
  74. func setReusePort(fd uintptr) error {
  75. return nil
  76. }