udp_socket.h 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  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. constexpr int UDP_LOW_LEVEL_HEADER_SIZE = 4;
  10. using NNetlibaSocket::EFragFlag;
  11. using NNetlibaSocket::FF_ALLOW_FRAG;
  12. using NNetlibaSocket::FF_DONT_FRAG;
  13. class TNetSocket: public TNonCopyable {
  14. TIntrusivePtr<NNetlibaSocket::ISocket> s;
  15. ui32 PortCrc;
  16. mutable int Tos;
  17. public:
  18. enum ESendError {
  19. SEND_OK,
  20. SEND_BUFFER_OVERFLOW,
  21. SEND_NO_ROUTE_TO_HOST,
  22. };
  23. TNetSocket()
  24. : PortCrc(0)
  25. , Tos(0)
  26. {
  27. }
  28. ~TNetSocket() {
  29. }
  30. void Open(int port);
  31. void Open(const TIntrusivePtr<NNetlibaSocket::ISocket>& socket);
  32. void Close();
  33. void SendSelfFakePacket() const;
  34. bool IsValid() const {
  35. return s.Get() ? s->IsValid() : false;
  36. }
  37. int GetNetworkOrderPort() const {
  38. return s->GetNetworkOrderPort();
  39. }
  40. ESendError SendTo(const char* buf, int size, const sockaddr_in6& toAddress, const EFragFlag frag) const;
  41. bool RecvFrom(char* buf, int* size, sockaddr_in6* fromAddress) const;
  42. void Wait(float timeoutSec) const;
  43. void SetTOS(int n) const;
  44. // obtaining icmp host unreachable in convoluted way
  45. bool Connect(const sockaddr_in6& addr);
  46. void SendEmptyPacket();
  47. bool IsHostUnreachable();
  48. };
  49. }