inetsock.go 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. package dhcp4client
  2. import (
  3. "net"
  4. "time"
  5. )
  6. type inetSock struct {
  7. *net.UDPConn
  8. laddr net.UDPAddr
  9. raddr net.UDPAddr
  10. }
  11. func NewInetSock(options ...func(*inetSock) error) (*inetSock, error) {
  12. c := &inetSock{
  13. laddr: net.UDPAddr{IP: net.IPv4(0, 0, 0, 0), Port: 68},
  14. raddr: net.UDPAddr{IP: net.IPv4bcast, Port: 67},
  15. }
  16. err := c.setOption(options...)
  17. if err != nil {
  18. return nil, err
  19. }
  20. conn, err := net.ListenUDP("udp4", &c.laddr)
  21. if err != nil {
  22. return nil, err
  23. }
  24. c.UDPConn = conn
  25. return c, err
  26. }
  27. func (c *inetSock) setOption(options ...func(*inetSock) error) error {
  28. for _, opt := range options {
  29. if err := opt(c); err != nil {
  30. return err
  31. }
  32. }
  33. return nil
  34. }
  35. func SetLocalAddr(l net.UDPAddr) func(*inetSock) error {
  36. return func(c *inetSock) error {
  37. c.laddr = l
  38. return nil
  39. }
  40. }
  41. func SetRemoteAddr(r net.UDPAddr) func(*inetSock) error {
  42. return func(c *inetSock) error {
  43. c.raddr = r
  44. return nil
  45. }
  46. }
  47. func (c *inetSock) Write(packet []byte) error {
  48. _, err := c.WriteToUDP(packet, &c.raddr)
  49. return err
  50. }
  51. func (c *inetSock) ReadFrom() ([]byte, net.IP, error) {
  52. readBuffer := make([]byte, MaxDHCPLen)
  53. n, source, err := c.ReadFromUDP(readBuffer)
  54. if source != nil {
  55. return readBuffer[:n], source.IP, err
  56. } else {
  57. return readBuffer[:n], net.IP{}, err
  58. }
  59. }
  60. func (c *inetSock) SetReadTimeout(t time.Duration) error {
  61. return c.SetReadDeadline(time.Now().Add(t))
  62. }