TCPSocket.cpp 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. #include "Assert.h"
  2. #include <winsock2.h>
  3. #pragma comment(lib, "wsock32.lib")
  4. #include "Types.h"
  5. #include "OS.h"
  6. namespace crown
  7. {
  8. namespace os
  9. {
  10. TCPSocket::TCPSocket()
  11. {
  12. WSADATA WsaData;
  13. CE_ASSERT(WSAStartup(MAKEWORD(2,2), &WsaData) == NO_ERROR, "Unable to initialize socket");
  14. set_socket_id(0);
  15. set_active_socket_id(0);
  16. }
  17. TCPSocket::~TCPSocket()
  18. {
  19. WSACleanup();
  20. close();
  21. }
  22. bool TCPSocket::open(unsigned int32_t16_t port)
  23. {
  24. int32_t sd = socket(AF_INET, SOCK_STREAM, 0);
  25. if (sd <= 0)
  26. {
  27. os::print32_tf("failed to open socket\n");
  28. set_socket_id(0);
  29. return false;
  30. }
  31. set_socket_id(sd);
  32. // Bind socket
  33. sockaddr_in address;
  34. address.sin_family = AF_INET;
  35. address.sin_addr.s_addr = htonl(INADDR_ANY);
  36. address.sin_port = htons(port);
  37. if (bind(sd, (const sockaddr*)&address, sizeof(sockaddr_in)) < 0)
  38. {
  39. os::print32_tf("failed to bind socket\n");
  40. close();
  41. return false;
  42. }
  43. listen(sd, 5);
  44. os::print32_tf("listening on port %d", port);
  45. sockaddr_in client;
  46. uint32_t client_length = sizeof(client);
  47. int32_t active_sd = accept(sd, (sockaddr*)&client, &client_length);
  48. if (active_sd < 0)
  49. {
  50. os::print32_tf("failed to accept connections");
  51. }
  52. set_active_socket_id(active_sd);
  53. return true;
  54. }
  55. bool TCPSocket::connect(IPv4Address& destination)
  56. {
  57. int32_t sd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  58. if (sd <= 0)
  59. {
  60. os::print32_tf("failed to open socket\n");
  61. set_socket_id(0);
  62. return false;
  63. }
  64. set_socket_id(sd);
  65. sockaddr_in address;
  66. address.sin_family = AF_INET;
  67. address.sin_addr.s_addr = htonl(destination.get_address());
  68. address.sin_port = htons(destination.get_port());
  69. if (::connect(sd, (const sockaddr*)&address, sizeof(sockaddr_in)) < 0)
  70. {
  71. os::print32_tf("failed to connect socket\n");
  72. close();
  73. return false;
  74. }
  75. }
  76. int32_t TCPSocket::close()
  77. {
  78. int32_t asd = get_active_socket_id();
  79. if (asd != 0)
  80. {
  81. closesocket(asd);
  82. set_active_socket_id(0);
  83. }
  84. int32_t sd = get_socket_id();
  85. if (sd != 0)
  86. {
  87. closesocket(sd);
  88. set_socket_id(0);
  89. }
  90. }
  91. bool TCPSocket::send(const void* data, int32_t size)
  92. {
  93. CE_ASSERT(data);
  94. CE_ASSERT(size > 0);
  95. int32_t sd = get_active_socket_id();
  96. if (sd <= 0)
  97. {
  98. set_socket_id(0);
  99. set_active_socket_id(0);
  100. return false;
  101. }
  102. int32_t sent_bytes = ::send(sd, (const char*)data, size, 0);
  103. if (sent_bytes <= 0)
  104. {
  105. os::print32_tf("Unable to send data");
  106. return false;
  107. }
  108. return true;
  109. }
  110. int32_t TCPSocket::receive(void* data, int32_t size)
  111. {
  112. CE_ASSERT(data);
  113. CE_ASSERT(size > 0);
  114. int32_t sd = get_active_socket_id();
  115. if ( sd <= 0 )
  116. {
  117. return false;
  118. }
  119. int32_t received_bytes = recv(sd, (char*)data, size, 0);
  120. if ( received_bytes <= 0 )
  121. {
  122. return 0;
  123. }
  124. return received_bytes;
  125. }
  126. bool TCPSocket::is_open()
  127. {
  128. return m_active_socket != 0 || m_socket != 0;
  129. }
  130. int32_t TCPSocket::get_socket_id()
  131. {
  132. return m_socket;
  133. }
  134. int32_t TCPSocket::get_active_socket_id()
  135. {
  136. return m_active_socket != 0 ? m_active_socket : m_socket;
  137. }
  138. void TCPSocket::set_socket_id(int32_t socket)
  139. {
  140. m_socket = socket;
  141. }
  142. void TCPSocket::set_active_socket_id(int32_t socket)
  143. {
  144. m_active_socket = socket;
  145. }
  146. }
  147. }