tcp_acceptor_impl.h 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. #pragma once
  2. #include "asio.h"
  3. #include "tcp_socket_impl.h"
  4. namespace NAsio {
  5. class TOperationAccept: public TFdOperation {
  6. public:
  7. TOperationAccept(SOCKET fd, TTcpSocket::TImpl& newSocket, TTcpAcceptor::TAcceptHandler h, TInstant deadline)
  8. : TFdOperation(fd, PollRead, deadline)
  9. , H_(h)
  10. , NS_(newSocket)
  11. {
  12. }
  13. bool Execute(int errorCode) override;
  14. TTcpAcceptor::TAcceptHandler H_;
  15. TTcpSocket::TImpl& NS_;
  16. };
  17. class TTcpAcceptor::TImpl: public TThrRefBase {
  18. public:
  19. TImpl(TIOService::TImpl& srv) noexcept
  20. : Srv_(srv)
  21. {
  22. }
  23. inline void Bind(TEndpoint& ep, TErrorCode& ec) noexcept {
  24. TSocketHolder s(socket(ep.SockAddr()->sa_family, SOCK_STREAM, 0));
  25. if (s == INVALID_SOCKET) {
  26. ec.Assign(LastSystemError());
  27. }
  28. FixIPv6ListenSocket(s);
  29. CheckedSetSockOpt(s, SOL_SOCKET, SO_REUSEADDR, 1, "reuse addr");
  30. SetNonBlock(s);
  31. if (::bind(s, ep.SockAddr(), ep.SockAddrLen())) {
  32. ec.Assign(LastSystemError());
  33. return;
  34. }
  35. S_.Swap(s);
  36. }
  37. inline void Listen(int backlog, TErrorCode& ec) noexcept {
  38. if (::listen(S_, backlog)) {
  39. ec.Assign(LastSystemError());
  40. return;
  41. }
  42. }
  43. inline void AsyncAccept(TTcpSocket& s, TTcpAcceptor::TAcceptHandler h, TInstant deadline) {
  44. Srv_.ScheduleOp(new TOperationAccept((SOCKET)S_, s.GetImpl(), h, deadline)); //set callback
  45. }
  46. inline void AsyncCancel() {
  47. Srv_.ScheduleOp(new TOperationCancel<TTcpAcceptor::TImpl>(this));
  48. }
  49. inline TIOService::TImpl& GetIOServiceImpl() const noexcept {
  50. return Srv_;
  51. }
  52. inline SOCKET Fd() const noexcept {
  53. return S_;
  54. }
  55. private:
  56. TIOService::TImpl& Srv_;
  57. TSocketHolder S_;
  58. };
  59. }