udp_socket.h 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. #pragma once
  2. #include <util/generic/ptr.h>
  3. #include <util/generic/utility.h>
  4. #include <library/cpp/netliba/socket/socket.h>
  5. namespace NNetliba {
  6. bool IsLocalIPv4(ui32 ip);
  7. bool IsLocalIPv6(ui64 network, ui64 iface);
  8. bool InitLocalIPList();
  9. enum {
  10. UDP_LOW_LEVEL_HEADER_SIZE = 4,
  11. };
  12. using NNetlibaSocket::EFragFlag;
  13. using NNetlibaSocket::FF_ALLOW_FRAG;
  14. using NNetlibaSocket::FF_DONT_FRAG;
  15. class TNetSocket: public TNonCopyable {
  16. TIntrusivePtr<NNetlibaSocket::ISocket> s;
  17. ui32 PortCrc;
  18. mutable int Tos;
  19. public:
  20. enum ESendError {
  21. SEND_OK,
  22. SEND_BUFFER_OVERFLOW,
  23. SEND_NO_ROUTE_TO_HOST,
  24. };
  25. TNetSocket()
  26. : PortCrc(0)
  27. , Tos(0)
  28. {
  29. }
  30. ~TNetSocket() {
  31. }
  32. void Open(int port);
  33. void Open(const TIntrusivePtr<NNetlibaSocket::ISocket>& socket);
  34. void Close();
  35. void SendSelfFakePacket() const;
  36. bool IsValid() const {
  37. return s.Get() ? s->IsValid() : false;
  38. }
  39. int GetNetworkOrderPort() const {
  40. return s->GetNetworkOrderPort();
  41. }
  42. ESendError SendTo(const char* buf, int size, const sockaddr_in6& toAddress, const EFragFlag frag) const;
  43. bool RecvFrom(char* buf, int* size, sockaddr_in6* fromAddress) const;
  44. void Wait(float timeoutSec) const;
  45. void SetTOS(int n) const;
  46. // obtaining icmp host unreachable in convoluted way
  47. bool Connect(const sockaddr_in6& addr);
  48. void SendEmptyPacket();
  49. bool IsHostUnreachable();
  50. };
  51. }