PageRenderTime 59ms CodeModel.GetById 26ms RepoModel.GetById 0ms app.codeStats 0ms

/src/net/src/socket.cpp

https://bitbucket.org/sourcey/libsourcey
C++ | 785 lines | 279 code | 141 blank | 365 comment | 32 complexity | 9407dacad18470950f2222eb97abbc90 MD5 | raw file
Possible License(s): MIT, GPL-3.0, ISC
  1. //
  2. // LibSourcey
  3. // Copyright (C) 2005, Sourcey <http://sourcey.com>
  4. //
  5. // LibSourcey is free software; you can redistribute it and/or
  6. // modify it under the terms of the GNU Lesser General Public
  7. // License as published by the Free Software Foundation; either
  8. // version 2.1 of the License, or (at your option) any later version.
  9. //
  10. // LibSourcey is distributed in the hope that it will be useful,
  11. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. // GNU General Public License for more details.
  14. //
  15. // You should have received a copy of the GNU General Public License
  16. // along with this program. If not, see <http://www.gnu.org/licenses/>.
  17. //
  18. #include "scy/net/socket.h"
  19. #include "scy/net/socketadapter.h"
  20. #include "scy/net/types.h"
  21. #include "scy/net/address.h"
  22. #include "scy/logger.h"
  23. using std::endl;
  24. namespace scy {
  25. namespace net {
  26. //
  27. // Socket
  28. //
  29. Socket::Socket() //:
  30. //_adapter(nullptr)//, //SharedObject(true), //new DeferredDeleter<Socket>()),
  31. //_insideCallback(false)
  32. {
  33. TraceLS(this) << "Create" << endl;
  34. }
  35. Socket::~Socket()
  36. {
  37. TraceLS(this) << "Destroy" << endl;
  38. // Delete the adapter, if any
  39. //if (_adapter)
  40. // delete _adapter;
  41. // The destructor never be called from inside a callback.
  42. // Deferred destruction ensures this never occurs.
  43. //assert(!_insideCallback && "destructor scope error");
  44. }
  45. void Socket::connect(const std::string& host, UInt16 port)
  46. {
  47. TraceLS(this) << "Connect to host: " << host << ":" << port << endl;
  48. if (Address::validateIP(host))
  49. connect(Address(host, port));
  50. else {
  51. init();
  52. assert(!closed());
  53. net::resolveDNS(host, port, [](const net::DNSResult& dns)
  54. {
  55. auto* sock = reinterpret_cast<Socket*>(dns.opaque);
  56. TraceL << "DNS resolved: " << dns.success() << endl;
  57. // Return if the socket was closed while resolving
  58. if (sock->closed()) {
  59. WarnL << "DNS resolved but socket closed" << endl;
  60. return;
  61. }
  62. // Set the connection error if DNS failed
  63. if (!dns.success()) {
  64. sock->setError("Failed to resolve DNS for " + dns.host);
  65. return;
  66. }
  67. try {
  68. // Connect to resolved host
  69. sock->connect(dns.addr);
  70. }
  71. catch (...) {
  72. // Swallow errors
  73. // Can be handled by Socket::Error signal
  74. }
  75. }, this);
  76. }
  77. }
  78. /*
  79. int Socket::send(const char* data, std::size_t len, int flags)
  80. {
  81. TraceLS(this) << "Send: " << len << endl;
  82. if (_adapter) {
  83. assert(_adapter->socket == this);
  84. return _adapter->send(data, len, flags);
  85. }
  86. return _base->send(data, len, flags);
  87. }
  88. int Socket::send(const char* data, std::size_t len, const Address& peerAddress, int flags)
  89. {
  90. TraceLS(this) << "Send to peer: " << peerAddress << ": " << len << endl;
  91. if (_adapter) {
  92. assert(_adapter->socket == this);
  93. return _adapter->send(data, len, peerAddress, flags);
  94. }
  95. return _base->send(data, len, peerAddress, flags);
  96. }
  97. */
  98. /*
  99. void Socket::setAdapter(SocketAdapter* adapter)
  100. {
  101. // Assign the new adapter pointer
  102. _adapter = adapter; //.swap(adapter);
  103. if (_adapter)
  104. _adapter->socket = this;
  105. }
  106. void Socket::replaceAdapter(SocketAdapter* adapter)
  107. {
  108. // NOTE: Just swap the SocketAdapter pointers as
  109. // we don't want to modify the container since we
  110. // may be inside the old adapter's callback scope.
  111. //_base->swapObserver(_adapter, adapter);
  112. // Defer deletion to the next iteration.
  113. // The old adapter will receive no more callbacks.
  114. if (_adapter)
  115. deleteLater<SocketAdapter>(_adapter);
  116. setAdapter(adapter);
  117. }
  118. SocketAdapter* Socket::adapter() const
  119. {
  120. return _adapter;
  121. }
  122. */
  123. #if 0
  124. Socket::Socket() : //SocketAdapter* adapter
  125. _base(nullptr),
  126. _adapter(nullptr)//,
  127. //_adapter(adapter)
  128. {
  129. //if (!_adapter)
  130. // _adapter = new SocketAdapter(this);
  131. //if (!_adapter->socket)
  132. // _adapter->socket = this;
  133. }
  134. Socket::Socket(Socket* base, bool shared) : //, SocketAdapter* adapter
  135. _base(base),
  136. _adapter(nullptr)
  137. {
  138. //if (!_adapter)
  139. // _adapter = new SocketAdapter(this);
  140. //if (!_adapter->socket)
  141. // _adapter->socket = this;
  142. if (_base) {
  143. _base->addObserver(this, shared);
  144. }
  145. }
  146. Socket::Socket(const Socket& socket) : //, SocketAdapter* adapter
  147. _base(socket._base),
  148. _adapter(nullptr)//,
  149. //_adapter(adapter)
  150. {
  151. if (_base) {
  152. _base->addObserver(this, true);
  153. }
  154. }
  155. Socket& Socket::operator = (const Socket& socket)
  156. {
  157. return assign(socket._base, true);
  158. }
  159. Socket& Socket::assign(Socket* base, bool shared)
  160. {
  161. if (_base != base) {
  162. if (_base) _base->removeObserver(this);
  163. _base = base;
  164. if (_base) _base->addObserver(this, shared);
  165. }
  166. return *this;
  167. }
  168. Socket::~Socket()
  169. {
  170. if (_base)
  171. _base->removeObserver(this);
  172. if (_adapter)
  173. delete _adapter;
  174. }
  175. bool Socket::shutdown()
  176. {
  177. return _base->shutdown();
  178. }
  179. void Socket::close()
  180. {
  181. _base->close();
  182. }
  183. bool Socket::closed() const
  184. {
  185. return _base->closed();
  186. }
  187. void Socket::connect(const Address& address)
  188. {
  189. return _base->connect(address);
  190. }
  191. void Socket::bind(const Address& address)
  192. {
  193. return _base->bind(address);
  194. }
  195. int Socket::send(const char* data, std::size_t len, int flags)
  196. {
  197. TraceLS(this) << "Send: " << len << endl;
  198. if (_adapter) {
  199. assert(_adapter->socket == this);
  200. return _adapter->send(data, len, flags);
  201. }
  202. return _base->send(data, len, flags);
  203. }
  204. int Socket::send(const char* data, std::size_t len, const Address& peerAddress, int flags)
  205. {
  206. TraceLS(this) << "Send to peer: " << peerAddress << ": " << len << endl;
  207. if (_adapter) {
  208. assert(_adapter->socket == this);
  209. return _adapter->send(data, len, peerAddress, flags);
  210. }
  211. return _base->send(data, len, peerAddress, flags);
  212. }
  213. int Socket::send(const IPacket& packet, int flags)
  214. {
  215. // Try to cast as RawPacket so we can send without copying any data.
  216. auto raw = dynamic_cast<const RawPacket*>(&packet);
  217. if (raw)
  218. return send((const char*)raw->data(), raw->size(), flags);
  219. // Dynamically generated packets need to be written to a
  220. // temp buffer for sending.
  221. else {
  222. Buffer buf;
  223. packet.write(buf);
  224. return send(buf.data(), buf.size(), flags);
  225. }
  226. }
  227. int Socket::send(const IPacket& packet, const Address& peerAddress, int flags)
  228. {
  229. // Try to cast as RawPacket so we can send without copying any data.
  230. auto raw = dynamic_cast<const RawPacket*>(&packet);
  231. if (raw)
  232. return send((const char*)raw->data(), raw->size(), peerAddress, flags);
  233. // Dynamically generated packets need to be written to a
  234. // temp buffer for sending.
  235. else {
  236. Buffer buf; //(2048);
  237. //buf.reserve(2048);
  238. packet.write(buf);
  239. return send(buf.data(), buf.size(), peerAddress, flags);
  240. }
  241. }
  242. void Socket::send(void*, IPacket& packet)
  243. {
  244. int res = send(packet);
  245. if (res < 0)
  246. throw std::runtime_error("Invalid socket operation");
  247. }
  248. Address Socket::address() const
  249. {
  250. return _base->address();
  251. }
  252. Address Socket::peerAddress() const
  253. {
  254. return _base->peerAddress();
  255. }
  256. void Socket::listen(int backlog)
  257. {
  258. _base->listen(backlog);
  259. }
  260. net::TransportType Socket::transport() const
  261. {
  262. return _base->transport();
  263. }
  264. void Socket::setError(const scy::Error& err)
  265. {
  266. return _base->setError(err);
  267. }
  268. void Socket::connect(const std::string& host, UInt16 port)
  269. {
  270. return _base->connect(host, port);
  271. }
  272. void Socket::onSocketConnect()
  273. {
  274. //TraceLS(this) << "On connect: " << socket->Connect.refCount() << endl;
  275. if (_adapter) {
  276. _adapter->onSocketConnect();
  277. }
  278. else {
  279. Connect.emit(this);
  280. }
  281. }
  282. void Socket::onSocketRecv(const MutableBuffer& buffer, const Address& peerAddress)
  283. {
  284. //TraceLS(this) << "On recv: " << buf.size() << endl;
  285. if (_adapter) {
  286. _adapter->onSocketRecv(buf, peerAddr);
  287. }
  288. else {
  289. SocketPacket packet(this, buf, peerAddr);
  290. Recv.emit(this, packet);
  291. }
  292. }
  293. void Socket::onSocketError(const scy::Error& error)
  294. {
  295. //TraceLS(this) << "On error: " << error.message << endl;
  296. if (_adapter) {
  297. _adapter->onSocketError(error);
  298. }
  299. else {
  300. Error.emit(this, error);
  301. }
  302. }
  303. void Socket::onSocketClose()
  304. {
  305. //TraceLS(this) << "On close" << endl;
  306. if (_adapter) {
  307. _adapter->onSocketClose();
  308. }
  309. else {
  310. assert(closed());
  311. Close.emit(this);
  312. }
  313. }
  314. const Error& Socket::error() const
  315. {
  316. return _base->error();
  317. }
  318. Socket& Socket::base() const
  319. {
  320. assert(_base);
  321. return *_base;
  322. }
  323. SocketAdapter* Socket::adapter() const
  324. {
  325. return _adapter;
  326. }
  327. void Socket::setAdapter(SocketAdapter* adapter)
  328. {
  329. // Assign the new adapter pointer
  330. _adapter = adapter;
  331. if (_adapter)
  332. _adapter->socket = this;
  333. }
  334. void Socket::replaceAdapter(SocketAdapter* adapter)
  335. {
  336. // NOTE: Just swap the SocketAdapter pointers as
  337. // we don't want to modify the container since we
  338. // may be inside the old adapter's callback scope.
  339. //_base->swapObserver(_adapter, adapter);
  340. // Defer deletion to the next iteration.
  341. // The old adapter will receive no more callbacks.
  342. if (_adapter)
  343. deleteLater<SocketAdapter>(_adapter);
  344. setAdapter(adapter);
  345. }
  346. int Socket::isNull() const
  347. {
  348. return _base == 0;
  349. }
  350. /*
  351. bool SocketAdapter::compareProiroty(const SocketAdapter* l, const SocketAdapter* r)
  352. {
  353. return l->priority > r->priority;
  354. }
  355. */
  356. #endif
  357. #if 0
  358. //
  359. // Socket Adapter
  360. //
  361. SocketAdapter::SocketAdapter(Socket::Ptr socket) : //, int priority
  362. socket(socket)//, priority(priority)
  363. {
  364. //TraceLS(this) << "Create" << endl;
  365. }
  366. SocketAdapter::~SocketAdapter()
  367. {
  368. //TraceLS(this) << "Destroy" << endl;
  369. }
  370. void SocketAdapter::onSocketConnect()
  371. {
  372. //TraceLS(this) << "On connect: " << socket->Connect.refCount() << endl;
  373. socket->Connect.emit(socket.get());
  374. }
  375. void SocketAdapter::onSocketRecv(const MutableBuffer& buffer, const Address& peerAddress)
  376. {
  377. //TraceLS(this) << "Recv: " << socket->Recv.refCount() << endl;
  378. SocketPacket packet(socket.get(), buf, peerAddr);
  379. socket->Recv.emit(socket.get(), packet);
  380. }
  381. void SocketAdapter::onSocketError(const Error& error) //const Error& error
  382. {
  383. //TraceLS(this) << "Error: " << socket->Error.refCount() << ": " << message << endl; syserr, message
  384. socket->Error.emit(socket.get(), error);
  385. }
  386. void SocketAdapter::onSocketClose()
  387. {
  388. //TraceLS(this) << "On close: " << socket->Close.refCount() << endl;
  389. socket->Close.emit(socket.get());
  390. }
  391. int SocketAdapter::send(const char* data, std::size_t len, int flags)
  392. {
  393. return socket->/*base().*/send(data, len, flags);
  394. }
  395. int SocketAdapter::send(const char* data, std::size_t len, const Address& peerAddress, int flags)
  396. {
  397. return socket->/*base().*/send(data, len, peerAddress, flags);
  398. }
  399. #endif
  400. } } // namespace scy::net
  401. /*
  402. void Socket::replaceAdapter(SocketAdapter* adapter)
  403. {
  404. // NOTE: Just swap the SocketAdapter pointers as
  405. // we don't want to modify the container since we
  406. // may be inside the old adapter's callback scope.
  407. //_base->swapObserver(_adapter, adapter);
  408. // Defer deletion to the next iteration.
  409. // The old adapter will receive no more callbacks.
  410. //if (_adapter)
  411. // deleteLater<SocketAdapter>(_adapter);
  412. setAdapter(adapter);
  413. }
  414. */
  415. /*
  416. void Socket::swapObserver(SocketAdapter* a, SocketAdapter* b)
  417. {
  418. for (std::vector<Socket*>::iterator it = _observers.begin(); it != _observers.end(); ++it) {
  419. if ((*it) == a) {
  420. *it = b;
  421. TraceLS(this) << "swapAdapter: " << a << ": " << b << endl;
  422. return;
  423. }
  424. }
  425. assert(0 && "unknown socket adapter");
  426. }
  427. */
  428. /*
  429. void Socket::sortObservers()
  430. {
  431. sort(_observers.begin(), _observers.end(), SocketAdapter::compareProiroty);
  432. }
  433. bool Socket::connected() const
  434. {
  435. return _connected;
  436. }
  437. */
  438. /*
  439. void Socket::setError(const Error& err)
  440. {
  441. TraceLS(this) << "Set error: " << err.message << endl;
  442. _error = err;
  443. }
  444. */
  445. //SocketAdapter* oldAdapter = _adapter;
  446. //_base->addObserver(adapter, true);
  447. //if (_adapter) {
  448. //_base->removeObserver(_adapter);
  449. //delete _adapter;
  450. //}
  451. //
  452. // SocketAdapter methods
  453. //
  454. /*
  455. int Socket::send(const IPacket& packet, int flags)
  456. {
  457. return _base->send(packet, flags);
  458. }
  459. int Socket::send(const IPacket& packet, const Address& peerAddress, int flags)
  460. {
  461. return _base->send(packet, peerAddress, flags);
  462. }
  463. */
  464. /*
  465. void Socket::duplicate()
  466. {
  467. _base->duplicate();
  468. }
  469. void Socket::release()
  470. {
  471. _base->release();
  472. }
  473. int base().refCount() const
  474. {
  475. return _base->refCount();
  476. }
  477. */
  478. /*
  479. SocketAdapter::SocketAdapter(int priority) :
  480. priority(priority)
  481. {
  482. //TraceLS(this) << "Create" << endl;
  483. }
  484. SocketAdapter::~SocketAdapter()
  485. {
  486. //TraceLS(this) << "Destroy" << endl;
  487. }
  488. */
  489. /*
  490. // -------------------------------------------------------------------
  491. //
  492. class Socket: public Handle<Socket>
  493. // Socket is the base class for accessing socket contexts.
  494. // It provides a disposible layer which referencing the
  495. // internal socket context.
  496. //
  497. // The common interface provides basic socket operations
  498. // can be extended as necessary for different protocols.
  499. {
  500. public:
  501. Socket() {};
  502. Socket(const Socket& socket);
  503. // Attaches the socket context from the other socket and
  504. // increments the reference count of the socket context.
  505. Socket(Socket* context);
  506. // Creates the Socket and attaches the given Socket.
  507. // The socket takes owership of the Socket.
  508. Socket& operator = (const Socket& socket);
  509. // Assignment operator.
  510. //
  511. // Releases the socket's socket context and
  512. // attaches the socket context from the other socket and
  513. // increments the reference count of the socket context.
  514. ~Socket();
  515. // Destroys the Socket and releases the socket context.
  516. Socket* base() const;
  517. // Returns the Socket for this socket.
  518. void connect(const Address& address);
  519. bool shutdown();
  520. void close();
  521. void bind(const Address& address);
  522. void listen(int backlog = 64);
  523. int send(const char* data, std::size_t len, int flags = 0);
  524. //int send(const char* data, std::size_t len, const Address& peerAddress, int flags = 0);
  525. //int send(const IPacket& packet, int flags = 0);
  526. //int send(const IPacket& packet, const Address& peerAddress, int flags = 0);
  527. Address address() const;
  528. // The locally bound address.
  529. Address peerAddress() const;
  530. // The connected peer address.
  531. net::TransportType transport() const;
  532. // The transport protocol: TCP, UDP or SSLTCP.
  533. // See TransportType definition.
  534. void duplicate();
  535. void release();
  536. int refCount() const;
  537. protected:
  538. Socket* _base;
  539. };
  540. */
  541. /*
  542. */
  543. /*
  544. void Stream::onError(const int errno)
  545. {
  546. }
  547. void Stream::onClose()
  548. {
  549. }
  550. */
  551. //_stream.reset(stream); // TODO: No need for this, managed by CountedHandle
  552. //if ()ptr ? ptr :
  553. //stream->data = ptr;
  554. //assert(_stream->data == nullptr ||
  555. // static_cast<Stream*>(_stream->data) == this);
  556. //_stream->data = this;
  557. // TODO: Close if needed.
  558. //TraceLS(this) << "Destroy: Send Close" << endl;
  559. // afterClose not always getting called
  560. //uv_close((uv_handle_t*)stream(), Stream::afterClose);
  561. //shutdown();
  562. //readStop();
  563. //close();
  564. /*
  565. int Stream::writeQueueSize() const
  566. {
  567. return stream()->write_queue_size;
  568. }
  569. if (_handle) {
  570. //TraceLS(this) << "Destroy: Handle" << endl;
  571. delete _handle;
  572. _handle = nullptr;
  573. }
  574. //TraceLS(this) << "Destroy: OK" << endl;
  575. */
  576. /*
  577. void Stream::close()
  578. {
  579. //TraceLS(this) << "Send Close" << endl;
  580. assert(0);
  581. // afterClose not always getting called
  582. //uv_close((uv_handle_t*)stream(), nullptr); //Stream::afterClose
  583. //delete this;
  584. //onClose();
  585. }
  586. //uv_close((uv_handle_t*)req->handle, afterClose);
  587. //Stream* io = static_cast<Stream*>(req->data);
  588. //io->close();
  589. void Stream::afterClose(uv_handle_t* peer)
  590. {
  591. //TraceL << "After Close: " << peer << endl;
  592. // NOTE: Sending Closed from close() method as afterClose
  593. // does not always fire depending on server response.
  594. //io->Close.emit(io, io->error().code);
  595. Stream* io = static_cast<Stream*>(peer->data);
  596. assert((uv_handle_t*)io->stream() == peer);
  597. delete peer;
  598. release();
  599. //::free(peer);
  600. }
  601. */