Főoldal | Névtérlista | Osztályhierarchia | Betűrendes lista | Adatszerkezetek | Könyvtárak | Fájllista | Névtértagok | Adatmezők | Globális elemek

SocketHandler.cpp

Ugrás a fájl dokumentációjához.
00001 /*
00002     mySocket, SocketHandler
00003     Copyright (C) 2006  Kornel Csernai <csko@csko.hu>
00004 
00005     This program is free software; you can redistribute it and/or modify
00006     it under the terms of the GNU General Public License as published by
00007     the Free Software Foundation; either version 2 of the License, or
00008     (at your option) any later version.
00009 
00010     This program is distributed in the hope that it will be useful,
00011     but WITHOUT ANY WARRANTY; without even the implied warranty of
00012     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00013     GNU General Public License for more details.
00014 
00015     You should have received a copy of the GNU General Public License
00016     along with this program; if not, write to the Free Software
00017     Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
00018 */
00019 #include <SocketHandler.h>
00020 #include <ListenServer.h>
00021 #include <RealSocket.h>
00022 #include <ConnectSocket.h>
00023 #include <IncomingSocket.h>
00024 #include <Errors.h>
00025 #include <StringLib.h>
00026 
00027 using namespace StringLib;
00028 
00029 // Constructor
00030 SocketHandler::SocketHandler(){
00031 
00032   socknum = 0;
00033   maxFD = 0;
00034   
00035   l_write = new DoubleLinkedList<RealSocket*>();
00036   l_read = new DoubleLinkedList<Socket*>();
00037 
00038   }
00039 
00040 // Destructor
00041 SocketHandler::~SocketHandler(){
00042 
00043   delete l_write;
00044   delete l_read;
00045 
00046   }
00047 
00048 // Do the socket cycling
00049 void SocketHandler::Handle(){
00050 
00051   if(!HaveSockets()) return; // we ain't got no sockets
00052 
00053   fd_set tmp_read, tmp_write, tmp_except;
00054   FD_ZERO(&tmp_except);
00055   FD_ZERO(&tmp_read);
00056   FD_ZERO(&tmp_write);
00057 
00058   int i;
00059 
00060   // modified every time
00061   tv.tv_sec  = 0;
00062   tv.tv_usec = 500;
00063 
00064   RealSocket* real;
00065 
00066   for(i=0; i<l_write->size(); i++){
00067 
00068     real = dynamic_cast<RealSocket*>(l_write->get(i));
00069     if(!real) throw SocketException(CAST_FAILED);
00070     
00071     if(real -> GetWriteLen() > 0){
00072 
00073       FD_SET(real->GetSock(), &tmp_write);
00074 
00075       }
00076 
00077     FD_SET(real->GetSock(), &tmp_except);
00078 
00079   
00080     }
00081 
00082   for(i=0; i<l_read->size(); i++){
00083 
00084     FD_SET(l_read->get(i)->GetSock(), &tmp_except);
00085     FD_SET(l_read->get(i)->GetSock(), &tmp_read);
00086   
00087     }
00088 
00089   Socket* sock;
00090   ListenServer* listenserver;
00091   ConnectSocket* connectsocket;
00092   
00093   int size; // nubsag, remove-nal bugozhat
00094 
00095   int ret = select(maxFD + 1, &tmp_read, &tmp_write, &tmp_except, &tv);
00096 
00097   if(ret == -1){
00098 
00099     throw SocketHandlerException(SELECT_FAILED);
00100 
00101     }else if(ret > 0){
00102 
00103     size = l_read->size();
00104     // is there an exception?
00105     for(i=0; i<size; i++){
00106 
00107       if(FD_ISSET(l_read->get(i)->GetSock(), &tmp_except)){ // found exception
00108 
00109         real = dynamic_cast<RealSocket*>(l_read->get(i));
00110 
00111           if(real and (connectsocket = dynamic_cast<ConnectSocket*>(l_read->get(i)))
00112                      and connectsocket -> IsConnected() ){ // see if is it a connected RealSocket
00113 
00114           l_read->get(i) -> OnReadError();
00115 
00116           Remove(connectsocket);
00117           i--;
00118 
00119           FD_CLR(connectsocket->GetSock(), &tmp_except);
00120           FD_CLR(connectsocket->GetSock(), &tmp_read);
00121           FD_CLR(connectsocket->GetSock(), &tmp_write);
00122 
00123           }else if(listenserver = dynamic_cast<ListenServer*>(l_read->get(i))){ // see if it is a ListenServer
00124           
00125           listenserver -> OnAcceptFailed();
00126 
00127           Remove(listenserver);
00128           i--;
00129 
00130           FD_CLR(listenserver->GetSock(), &tmp_except);
00131           FD_CLR(listenserver->GetSock(), &tmp_read);
00132           
00133           }/*else if(dynamic_cast<IncomingSocket*>(l_read->get(i))){
00134           
00135           cout << l_read->get(i) << " inkomingszokit! " << endl;
00136 //        sock -> OnConnectionError();
00137           
00138           }*/else if(connectsocket and !connectsocket->IsConnected()){ // never happens, yet
00139 
00140           connectsocket -> OnConnectionError();
00141 
00142           }
00143       
00144         }    
00145 
00146       }
00147     
00148     
00149     // can we write anywhere?
00150     size = l_write->size();
00151     for(i=0; i<size; i++){
00152     
00153       real = dynamic_cast<RealSocket*>(l_write->get(i));
00154 //      if(!real) throw SocketException(CAST_FAILED);
00155       if(!real) continue;
00156     
00157       if(real -> GetWriteLen() > 0 and FD_ISSET(real -> GetSock(), &tmp_write)){
00158    
00159         real -> OnWrite();
00160       
00161         }
00162     
00163       }
00164     
00165     size = l_read->size();
00166     // can we read anything?
00167     for(i=0; i<size; i++){
00168     
00169       if(l_read->get(i) == NULL) {
00170       
00171         i++;
00172         continue;
00173         
00174         }
00175     
00176       if(FD_ISSET(l_read->get(i)->GetSock(), &tmp_read)){ // there's something to read
00177       
00178         if(real = dynamic_cast<RealSocket*>(l_read->get(i))){
00179 
00180           try {
00181 
00182             real -> OnRead();
00183           
00184             }
00185 
00186           catch(SocketException){
00187         
00188             Remove(connectsocket);
00189             i--;
00190 
00191             FD_CLR(connectsocket->GetSock(), &tmp_except);
00192             FD_CLR(connectsocket->GetSock(), &tmp_read);
00193             FD_CLR(connectsocket->GetSock(), &tmp_write);
00194         
00195             }
00196 
00197       }else if(listenserver = dynamic_cast<ListenServer*>(l_read->get(i))){
00198 
00199           try {
00200 
00201             listenserver -> OnAccept();
00202             i++;
00203             
00204             }
00205 
00206           catch(SocketException){
00207         
00208             listenserver -> OnAcceptFailed();
00209 
00210             }
00211 
00212           }
00213           
00214         }
00215     
00216       }
00217 
00218     }
00219 
00220   }
00221 
00222 // Do we have any sockets?
00223 bool SocketHandler::HaveSockets(){
00224 
00225   return socknum > 0;
00226 
00227   }
00228 
00229 // Add Socket* to cycle
00230 void SocketHandler::Add(Socket* sock){
00231 
00232   l_read -> add(sock);
00233 
00234   
00235   RealSocket* real = dynamic_cast<RealSocket*>(sock);
00236 
00237   if(real){ // if sock is not a ListenServer
00238   
00239     l_write -> add(real);
00240   
00241     }
00242 
00243   maxFD = maxFD >= sock -> GetSock() ? maxFD : sock->GetSock();
00244   debug("Socket added.");
00245   socknum++;
00246 
00247   }
00248 
00249 // Remove Socket* from cycle
00250 void SocketHandler::Remove(Socket* sock){
00251 
00252   l_read -> remove(sock);
00253   RealSocket* real = dynamic_cast<RealSocket*>(sock);
00254 
00255   if(real){ // if sock is not a ListenServer
00256   
00257     l_write -> remove(real);
00258   
00259     }
00260 
00261   debug("Removed socket. (" + itos(sock->GetSock()) + (string) ")");
00262 
00263   socknum--;
00264 
00265   }

SourceForge.netLogo