Highly-opinionated (ex-bullshit-free) MTPROTO proxy for Telegram. If you use v1.0 or upgrade broke you proxy, please read the chapter Version 2
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. package network
  2. import (
  3. "fmt"
  4. "net"
  5. )
  6. // SetClientSocketOptions tunes a TCP socket that represents a connection to
  7. // end user (not Telegram service or fronting domain).
  8. func SetClientSocketOptions(conn net.Conn, bufferSize int) error {
  9. tcpConn := conn.(*net.TCPConn) // nolint: forcetypeassert
  10. if err := tcpConn.SetNoDelay(false); err != nil {
  11. return fmt.Errorf("cannot disable TCP_NO_DELAY: %w", err)
  12. }
  13. return setCommonSocketOptions(tcpConn, bufferSize)
  14. }
  15. // SetServerSocketOptions tunes a TCP socket that represents a connection to
  16. // remote server like Telegram or fronting domain (but not end user).
  17. func SetServerSocketOptions(conn net.Conn, bufferSize int) error {
  18. tcpConn := conn.(*net.TCPConn) // nolint: forcetypeassert
  19. if err := tcpConn.SetNoDelay(true); err != nil {
  20. return fmt.Errorf("cannot enable TCP_NO_DELAY: %w", err)
  21. }
  22. return setCommonSocketOptions(tcpConn, bufferSize)
  23. }
  24. func setCommonSocketOptions(conn *net.TCPConn, bufferSize int) error {
  25. if err := conn.SetReadBuffer(bufferSize); err != nil {
  26. return fmt.Errorf("cannot set read buffer size: %w", err)
  27. }
  28. if err := conn.SetWriteBuffer(bufferSize); err != nil {
  29. return fmt.Errorf("cannot set write buffer size: %w", err)
  30. }
  31. if err := conn.SetKeepAlive(false); err != nil {
  32. return fmt.Errorf("cannot disable TCP keepalive probes: %w", err)
  33. }
  34. if err := conn.SetLinger(tcpLingerTimeout); err != nil {
  35. return fmt.Errorf("cannot set TCP linger timeout: %w", err)
  36. }
  37. rawConn, err := conn.SyscallConn()
  38. if err != nil {
  39. return fmt.Errorf("cannot get underlying raw connection: %w", err)
  40. }
  41. if err := setSocketReuseAddrPort(rawConn, bufferSize); err != nil {
  42. return fmt.Errorf("cannot setup SO_REUSEADDR/PORT: %w", err)
  43. }
  44. return nil
  45. }