00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
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
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
00041 SocketHandler::~SocketHandler(){
00042
00043 delete l_write;
00044 delete l_read;
00045
00046 }
00047
00048
00049 void SocketHandler::Handle(){
00050
00051 if(!HaveSockets()) return;
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
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;
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
00105 for(i=0; i<size; i++){
00106
00107 if(FD_ISSET(l_read->get(i)->GetSock(), &tmp_except)){
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() ){
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))){
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 }
00134
00135
00136
00137
00138 else if(connectsocket and !connectsocket->IsConnected()){
00139
00140 connectsocket -> OnConnectionError();
00141
00142 }
00143
00144 }
00145
00146 }
00147
00148
00149
00150 size = l_write->size();
00151 for(i=0; i<size; i++){
00152
00153 real = dynamic_cast<RealSocket*>(l_write->get(i));
00154
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
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)){
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
00223 bool SocketHandler::HaveSockets(){
00224
00225 return socknum > 0;
00226
00227 }
00228
00229
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){
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
00250 void SocketHandler::Remove(Socket* sock){
00251
00252 l_read -> remove(sock);
00253 RealSocket* real = dynamic_cast<RealSocket*>(sock);
00254
00255 if(real){
00256
00257 l_write -> remove(real);
00258
00259 }
00260
00261 debug("Removed socket. (" + itos(sock->GetSock()) + (string) ")");
00262
00263 socknum--;
00264
00265 }