Guest User

Untitled

a guest
Nov 20th, 2018
123
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.29 KB | None | 0 0
  1. #include "tcp.h"
  2.  
  3.  
  4.  
  5.  
  6.  
  7. namespace tcp
  8. {
  9. //struct sock {
  10. // sock();
  11.  
  12. // void (*on_recv)(sock _this, status st);
  13.  
  14. // status send( uint8_t *buffer, uint32_t buffer_len, void (*on_sent)(sock _this, status st) );
  15. // status connect( void (*on_connect)(sock _this, status st) );
  16.  
  17. //private:
  18. // SOCKET s;
  19. //};
  20.  
  21. sock::sock( SOCKET s )
  22. {
  23. this->s = s;
  24. this->on_recv = nullptr;
  25. }
  26.  
  27. sock::sock()
  28. {
  29. this->s = SOCKET_ERROR;
  30. this->on_recv = nullptr;
  31. }
  32.  
  33. status sock::send( uint8_t *buffer, uint32_t buffer_len, void (*on_sent)(sock *_this, status st) )
  34. {
  35. std::thread( [buffer, buffer_len, on_sent] (sock *__this, SOCKET s) {
  36. int r = ::send( s, (const char *)buffer, buffer_len, NULL );
  37.  
  38. if ( on_sent )
  39. on_sent(__this, r != SOCKET_ERROR ? status::OK : status::FAIL );
  40.  
  41. }, this, this->s).detach();
  42.  
  43. return status::OK;
  44. }
  45.  
  46.  
  47. status sock::listen( char *address, uint16_t port, void (*on_accept)(sock *_this, status st) )
  48. {
  49. int r;
  50. SOCKET s;
  51. sockaddr_in name;
  52.  
  53. s = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );
  54. assert( s != SOCKET_ERROR );
  55.  
  56. memset( &name, 0, sizeof(name) );
  57. name.sin_addr.s_addr = inet_addr( address );
  58. name.sin_port = htons(port);
  59. name.sin_family = AF_INET;
  60.  
  61. r = bind( s, (sockaddr *)&name, sizeof(name) );
  62. assert( r != SOCKET_ERROR );
  63.  
  64. r = ::listen( s, 64 );
  65. assert( r != SOCKET_ERROR );
  66.  
  67. std::thread( [s, on_accept] () {
  68. int namelen;
  69. sockaddr_in name;
  70. SOCKET con;
  71. sock sk;
  72.  
  73. for (;;) {
  74. namelen = sizeof(name);
  75. con = accept( s, (sockaddr *)&name, &namelen );
  76. assert( con != SOCKET_ERROR );
  77. sk = sock( con );
  78.  
  79. on_accept( &sk, status::OK );
  80.  
  81. std::thread( [] (sock sk) {
  82. int r;
  83. char buff[1536];
  84.  
  85. for (;;) {
  86. r = recv( sk.s, buff, sizeof(buff), NULL );
  87.  
  88. if ( r == 0 ) { // close connection
  89. if ( sk.on_recv )
  90. sk.on_recv( &sk, nullptr, r, status::OK );
  91.  
  92. return;
  93. } else if ( r == -1 ) { // error.
  94. if ( sk.on_recv )
  95. sk.on_recv( &sk, nullptr, r, status::FAIL );
  96.  
  97. return;
  98. } else { // data
  99. if ( sk.on_recv )
  100. sk.on_recv( &sk, (uint8_t *)buff, r, status::OK );
  101. }
  102. }
  103.  
  104. }, sk).detach();
  105. }
  106. }).detach();
  107.  
  108. return status::OK;
  109. }
  110. };
Add Comment
Please, Sign In to add comment