Client.cpp 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. #include <iostream>
  2. #include <sys/socket.h>
  3. #include <arpa/inet.h>
  4. #include <cstring>
  5. #include <stdexcept>
  6. #include <unistd.h>
  7. #include <poll.h>
  8. #include "client/network/Client.h"
  9. #include "common/stream/Stream.h"
  10. Client::Client()
  11. {
  12. }
  13. Client::~Client()
  14. {
  15. if(connectionSocket != -1)
  16. {
  17. close(connectionSocket);
  18. }
  19. }
  20. bool Client::start(const string& ip, unsigned short port, IClientListener* listener)
  21. {
  22. connectionSocket = socket(AF_INET, SOCK_STREAM, 0);
  23. if(connectionSocket == -1)
  24. {
  25. throw runtime_error(string("cannot create socket: ") + strerror(errno));
  26. }
  27. struct sockaddr_in socketData;
  28. memset(&socketData, 0, sizeof(struct sockaddr_in));
  29. socketData.sin_family = AF_INET;
  30. socketData.sin_port = htons(port);
  31. if(inet_aton(ip.data(), &socketData.sin_addr) == 0)
  32. {
  33. throw runtime_error(ip + " is not a valid ip");
  34. }
  35. if(connect(connectionSocket, (struct sockaddr*) &socketData, sizeof(struct sockaddr_in)) == 0)
  36. {
  37. clientListener = listener;
  38. shouldRun = true;
  39. serverListenThread = thread(&Client::listenOnServer, this);
  40. return true;
  41. }
  42. return false;
  43. }
  44. void Client::stop()
  45. {
  46. shouldRun = false;
  47. serverListenThread.join();
  48. }
  49. void Client::listenOnServer()
  50. {
  51. struct pollfd fds;
  52. fds.fd = connectionSocket;
  53. fds.events = POLLIN;
  54. fds.revents = 0;
  55. clientListener->onServerJoin(connectionSocket);
  56. Stream st;
  57. while(shouldRun)
  58. {
  59. int pollData = poll(&fds, 1, 100);
  60. if(pollData > 0)
  61. {
  62. st.readSocket(connectionSocket);
  63. if(st.hasData())
  64. {
  65. clientListener->onServerPackage(connectionSocket, st);
  66. }
  67. else
  68. {
  69. // server closed connection
  70. clientListener->onServerClose(connectionSocket);
  71. break;
  72. }
  73. }
  74. else if(pollData == -1)
  75. {
  76. cout << "poll error: " << strerror(errno) << endl;
  77. }
  78. }
  79. }