TCPServer.cpp 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. #include "TCPServer.h"
  2. char TCPServer::msg[MAXPACKETSIZE];
  3. int TCPServer::num_client;
  4. int TCPServer::last_closed;
  5. bool TCPServer::isonline;
  6. vector<descript_socket*> TCPServer::Message;
  7. vector<descript_socket*> TCPServer::newsockfd;
  8. std::mutex TCPServer::mt;
  9. std::mutex TCPServer::mt_sock_;
  10. void* TCPServer::Task(void *arg)
  11. {
  12. int n;
  13. struct descript_socket *desc = (struct descript_socket*) arg;
  14. pthread_detach(pthread_self());
  15. cerr << "open client[ id:"<< desc->id <<" ip:"<< desc->ip <<" socket:"<< desc->socket<<" send:"<< desc->enable_message_runtime <<" ]" << endl;
  16. while(1)
  17. {
  18. n = recv(desc->socket, msg, MAXPACKETSIZE, 0);
  19. if(n != -1)
  20. {
  21. if(n==0)
  22. {
  23. isonline = false;
  24. cerr << "close client[ id:"<< desc->id <<" ip:"<< desc->ip <<" socket:"<< desc->socket<<" ]" << endl;
  25. last_closed = desc->id;
  26. close(desc->socket);
  27. int id = desc->id;
  28. mt_sock_.lock();
  29. auto new_end = std::remove_if(newsockfd.begin(), newsockfd.end(),
  30. [id](descript_socket *device)
  31. { return device->id == id; });
  32. newsockfd.erase(new_end, newsockfd.end());
  33. if(num_client>0) num_client--;
  34. mt_sock_.unlock();
  35. break;
  36. }
  37. msg[n]=0;
  38. desc->message = string(msg);
  39. std::lock_guard<std::mutex> guard(mt);
  40. Message.push_back( desc );
  41. }
  42. usleep(600);
  43. }
  44. if(desc != NULL)
  45. {
  46. delete desc;
  47. desc = NULL;
  48. }
  49. cerr << "exit thread: " << this_thread::get_id() << endl;
  50. pthread_exit(NULL);
  51. return 0;
  52. }
  53. int TCPServer::setup(int port, vector<int> opts)
  54. {
  55. int opt = 1;
  56. isonline = false;
  57. last_closed = -1;
  58. sockfd = socket(AF_INET,SOCK_STREAM,0);
  59. memset(&serverAddress,0,sizeof(serverAddress));
  60. for(unsigned int i = 0; i < opts.size(); i++) {
  61. if( (setsockopt(sockfd, SOL_SOCKET, opts.size(), (char *)&opt, sizeof(opt))) < 0 ) {
  62. cerr << "Errore setsockopt" << endl;
  63. return -1;
  64. }
  65. }
  66. serverAddress.sin_family = AF_INET;
  67. serverAddress.sin_addr.s_addr = htonl(INADDR_ANY);
  68. serverAddress.sin_port = htons(port);
  69. if((::bind(sockfd,(struct sockaddr *)&serverAddress, sizeof(serverAddress))) < 0){
  70. cerr << "Errore bind" << endl;
  71. return -1;
  72. }
  73. if(listen(sockfd,5) < 0){
  74. cerr << "Errore listen" << endl;
  75. return -1;
  76. }
  77. num_client = 0;
  78. isonline = true;
  79. return 0;
  80. }
  81. void TCPServer::accepted()
  82. {
  83. socklen_t sosize = sizeof(clientAddress);
  84. descript_socket *so = new descript_socket;
  85. so->socket = accept(sockfd,(struct sockaddr*)&clientAddress,&sosize);
  86. so->id = num_client;
  87. so->ip = inet_ntoa(clientAddress.sin_addr);
  88. mt_sock_.lock();
  89. newsockfd.push_back( so );
  90. mt_sock_.unlock();
  91. cerr << "accept client[ id:" << newsockfd[num_client]->id <<
  92. " ip:" << newsockfd[num_client]->ip <<
  93. " handle:" << newsockfd[num_client]->socket << " ]" << endl;
  94. pthread_create(&serverThread[num_client], NULL, &Task, (void *)newsockfd[num_client]);
  95. isonline=true;
  96. num_client++;
  97. }
  98. vector<descript_socket*> TCPServer::getMessage()
  99. {
  100. std::lock_guard<std::mutex> guard(mt);
  101. return Message;
  102. }
  103. void TCPServer::Send(string msg, int id)
  104. {
  105. std::lock_guard<std::mutex> guard(mt_sock_);
  106. send(newsockfd[id]->socket,msg.c_str(),msg.length(),0);
  107. }
  108. int TCPServer::get_last_closed_sockets()
  109. {
  110. return last_closed;
  111. }
  112. void TCPServer::clean(int id)
  113. {
  114. Message[id] = NULL;
  115. memset(msg, 0, MAXPACKETSIZE);
  116. }
  117. string TCPServer::get_ip_addr(int id)
  118. {
  119. return newsockfd[id]->ip;
  120. }
  121. bool TCPServer::is_online()
  122. {
  123. return isonline;
  124. }
  125. void TCPServer::detach(int id)
  126. {
  127. std::lock_guard<std::mutex> guard(mt_sock_);
  128. close(newsockfd[id]->socket);
  129. newsockfd[id]->ip = "";
  130. newsockfd[id]->id = -1;
  131. newsockfd[id]->message = "";
  132. }
  133. void TCPServer::closed()
  134. {
  135. close(sockfd);
  136. }