interconnect_stream.h 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. #pragma once
  2. #include <util/generic/string.h>
  3. #include <util/generic/noncopyable.h>
  4. #include <util/network/address.h>
  5. #include <util/network/init.h>
  6. #include <util/system/defaults.h>
  7. #include "poller.h"
  8. #include "interconnect_address.h"
  9. #include <memory>
  10. #include <sys/uio.h>
  11. namespace NInterconnect {
  12. class TSocket: public NActors::TSharedDescriptor, public TNonCopyable {
  13. protected:
  14. TSocket(SOCKET fd);
  15. virtual ~TSocket() override;
  16. SOCKET Descriptor;
  17. virtual int GetDescriptor() override;
  18. private:
  19. friend class TSecureSocket;
  20. SOCKET ReleaseDescriptor() {
  21. return std::exchange(Descriptor, INVALID_SOCKET);
  22. }
  23. public:
  24. operator SOCKET() const {
  25. return Descriptor;
  26. }
  27. int Bind(const TAddress& addr) const;
  28. int Shutdown(int how) const;
  29. int GetConnectStatus() const;
  30. };
  31. class TStreamSocket: public TSocket {
  32. public:
  33. TStreamSocket(SOCKET fd);
  34. static TIntrusivePtr<TStreamSocket> Make(int domain);
  35. virtual ssize_t Send(const void* msg, size_t len, TString *err = nullptr) const;
  36. virtual ssize_t Recv(void* buf, size_t len, TString *err = nullptr) const;
  37. virtual ssize_t WriteV(const struct iovec* iov, int iovcnt) const;
  38. virtual ssize_t ReadV(const struct iovec* iov, int iovcnt) const;
  39. int Connect(const TAddress& addr) const;
  40. int Connect(const NAddr::IRemoteAddr* addr) const;
  41. int Listen(int backlog) const;
  42. int Accept(TAddress& acceptedAddr) const;
  43. ssize_t GetUnsentQueueSize() const;
  44. void SetSendBufferSize(i32 len) const;
  45. ui32 GetSendBufferSize() const;
  46. };
  47. class TSecureSocketContext {
  48. class TImpl;
  49. THolder<TImpl> Impl;
  50. friend class TSecureSocket;
  51. public:
  52. TSecureSocketContext(const TString& certificate, const TString& privateKey, const TString& caFilePath,
  53. const TString& ciphers);
  54. ~TSecureSocketContext();
  55. public:
  56. using TPtr = std::shared_ptr<TSecureSocketContext>;
  57. };
  58. class TSecureSocket : public TStreamSocket {
  59. TSecureSocketContext::TPtr Context;
  60. class TImpl;
  61. THolder<TImpl> Impl;
  62. public:
  63. enum class EStatus {
  64. SUCCESS,
  65. ERROR,
  66. WANT_READ,
  67. WANT_WRITE,
  68. };
  69. public:
  70. TSecureSocket(TStreamSocket& socket, TSecureSocketContext::TPtr context);
  71. ~TSecureSocket();
  72. EStatus Establish(bool server, bool authOnly, TString& err) const;
  73. TIntrusivePtr<TStreamSocket> Detach();
  74. ssize_t Send(const void* msg, size_t len, TString *err) const override;
  75. ssize_t Recv(void* msg, size_t len, TString *err) const override;
  76. ssize_t WriteV(const struct iovec* iov, int iovcnt) const override;
  77. ssize_t ReadV(const struct iovec* iov, int iovcnt) const override;
  78. TString GetCipherName() const;
  79. int GetCipherBits() const;
  80. TString GetProtocolName() const;
  81. TString GetPeerCommonName() const;
  82. bool WantRead() const;
  83. bool WantWrite() const;
  84. };
  85. class TDatagramSocket: public TSocket {
  86. public:
  87. typedef std::shared_ptr<TDatagramSocket> TPtr;
  88. TDatagramSocket(SOCKET fd);
  89. static TPtr Make(int domain);
  90. ssize_t SendTo(const void* msg, size_t len, const TAddress& toAddr) const;
  91. ssize_t RecvFrom(void* buf, size_t len, TAddress& fromAddr) const;
  92. };
  93. }