SocketRegistry.cpp
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:5k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2003 MySQL AB
  2.    This program is free software; you can redistribute it and/or modify
  3.    it under the terms of the GNU General Public License as published by
  4.    the Free Software Foundation; either version 2 of the License, or
  5.    (at your option) any later version.
  6.    This program is distributed in the hope that it will be useful,
  7.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  8.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  9.    GNU General Public License for more details.
  10.    You should have received a copy of the GNU General Public License
  11.    along with this program; if not, write to the Free Software
  12.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
  13. #include "SocketRegistry.hpp"
  14. #include <Parser.hpp>
  15. template<class T>
  16. SocketRegistry<T>::SocketRegistry(Uint32 maxSocketClients) {
  17. }
  18. template<class T>
  19. SocketRegistry<T>::~SocketRegistry() {
  20.   delete [] m_socketClients;
  21. }
  22. template<class T>
  23. bool 
  24. SocketRegistry<T>::createSocketClient(const char * host, Uint16 port) {
  25.   if(port == 0)
  26.     return false;
  27.   if(host==NULL)
  28.     return false;
  29.   
  30.   SocketClient * socketClient = new SocketClient(host, port);
  31.   if(socketClient->openSocket() < 0 || socketClient == NULL) {
  32.     ndbout << "could not connect" << endl;
  33.     delete socketClient;
  34.     return false;
  35.   }
  36.   else {
  37.     m_socketClients[m_nSocketClients] = socketClient;
  38.     m_nSocketClients++;
  39.   }
  40.   return true;
  41. }
  42. template<class T>
  43. int 
  44. SocketRegistry<T>::pollSocketClients(Uint32 timeOutMillis) {
  45.   // Return directly if there are no TCP transporters configured
  46.   if (m_nSocketClients == 0){
  47.     tcpReadSelectReply = 0;
  48.     return 0;
  49.   }
  50.   struct timeval timeout;
  51.   timeout.tv_sec  = timeOutMillis / 1000;
  52.   timeout.tv_usec = (timeOutMillis % 1000) * 1000;
  53.   NDB_SOCKET_TYPE maxSocketValue = 0;
  54.   
  55.   // Needed for TCP/IP connections
  56.   // The read- and writeset are used by select
  57.   
  58.   FD_ZERO(&tcpReadset);
  59.   // Prepare for sending and receiving
  60.   for (Uint32 i = 0; i < m_nSocketClients; i++) {
  61.     SocketClient * t = m_socketClients[i];
  62.     
  63.     // If the socketclient is connected
  64.     if (t->isConnected()) {
  65.       
  66.       const NDB_SOCKET_TYPE socket = t->getSocket();
  67.       // Find the highest socket value. It will be used by select
  68.       if (socket > maxSocketValue)
  69. maxSocketValue = socket;
  70.       
  71.       // Put the connected transporters in the socket read-set 
  72.       FD_SET(socket, &tcpReadset);
  73.     }
  74.   }
  75.   
  76.   // The highest socket value plus one
  77.   maxSocketValue++; 
  78.   
  79.   tcpReadSelectReply = select(maxSocketValue, &tcpReadset, 0, 0, &timeout);  
  80. #ifdef NDB_WIN32
  81.   if(tcpReadSelectReply == SOCKET_ERROR)
  82.   {
  83.     NdbSleep_MilliSleep(timeOutMillis);
  84.   }
  85. #endif
  86.   return tcpReadSelectReply;
  87. }
  88. template<class T>
  89. bool 
  90. SocketRegistry<T>::performSend(const char * buf, 
  91.        Uint32 len, 
  92.        const char * remotehost)
  93. {
  94.   SocketClient * socketClient;
  95.   for(Uint32 i=0; i < m_nSocketClients; i++) {
  96.     socketClient = m_socketClients[i];
  97.     if(strcmp(socketClient->gethostname(), remotehost)==0) {
  98.       if(socketClient->isConnected()) {
  99. if(socketClient->writeSocket(buf, len)>0)
  100.   return true;
  101. else
  102.   return false;
  103.       }
  104.     }
  105.   }
  106.   return false;
  107. }
  108. template<class T>
  109. int 
  110. SocketRegistry<T>::performReceive(T & t) {  
  111.   char buf[255] ; //temp. just for testing. must fix better
  112.   if(tcpReadSelectReply > 0){
  113.     for (Uint32 i=0; i<m_nSocketClients; i++) {
  114.       SocketClient *sc = m_socketClients[i];
  115.       const NDB_SOCKET_TYPE socket    = sc->getSocket();
  116.       if(sc->isConnected() && FD_ISSET(socket, &tcpReadset)) {
  117. t->runSession(socket,t);
  118.       }
  119.     }
  120.     return 1;
  121.   }
  122.   return 0;
  123.   
  124. }
  125. template<class T>
  126. inline
  127. int 
  128. SocketRegistry<T>::syncPerformReceive(char * host,
  129.       T & t,
  130.       Uint32 timeOutMillis) {  
  131.   char buf[255] ; //temp. just for testing. must fix better
  132.   struct timeval timeout;
  133.   timeout.tv_sec  = timeOutMillis / 1000;
  134.   timeout.tv_usec = (timeOutMillis % 1000) * 1000;
  135.   int reply;
  136.   SocketClient * sc;
  137.   for(Uint32 i=0; i < m_nSocketClients; i++) {
  138.     sc = m_socketClients[i];
  139.     if(strcmp(sc->gethostname(), remotehost)==0) {
  140.       if(sc->isConnected()) {
  141. FD_ZERO(&tcpReadset);
  142. reply = select(sc->getSocket(), &tcpReadset, 0, 0, &timeout);
  143. if(reply > 0) {
  144.   return t->runSession(sc->getSocket(), t);
  145. }
  146.       }
  147.       
  148.     }
  149.   }
  150.   return 0;
  151. }
  152. template<class T>
  153. bool 
  154. SocketRegistry<T>::reconnect(const char * host){
  155.   for(Uint32 i=0; i < m_nSocketClients; i++) {
  156.     SocketClient * socketClient = m_socketClients[i];
  157.     if(strcmp(socketClient->gethostname(), host)==0) {
  158.       if(!socketClient->isConnected()) {
  159. if(socketClient->openSocket() > 0)
  160.   return true;
  161. else return false;
  162.       }
  163.     }
  164.   }
  165.   return false;
  166. }
  167. template<class T>
  168. bool 
  169. SocketRegistry<T>::removeSocketClient(const char * host){
  170.   for(Uint32 i=0; i < m_nSocketClients; i++) {
  171.     SocketClient * socketClient = m_socketClients[i];
  172.     if(strcmp(socketClient->gethostname(), host)==0) {
  173.       if(!socketClient->isConnected()) {
  174. if(socketClient->closeSocket() > 0) {
  175.   delete socketClient;
  176.   return true;
  177. }
  178. else return false;
  179.       }
  180.     }
  181.   }
  182.   return false;
  183. }