00001 #include "server.h"
00002
00003 namespace n2nc {
00004
00005 using namespace n2nc ;
00006
00007 ClientInfo * Server::getClientInfo(net::Socket * sock, ClientInfo::ClientID id){
00008 m_peers_it_sk pit1 ;
00009 m_peers_it_id pit2 ;
00010 if(sock){
00011
00012
00013 }else if(id){
00014 pit2 = this->m_online_peers_id.find ( id );
00015 return (pit2 != this->m_online_peers_id.end()) ? pit2->second : NULL ;
00016 }else{
00017
00018 return NULL ;
00019 }
00020 }
00021
00022 ClientInfo * Server::newClientInfo(net::Socket * sock, ClientInfo::ClientID id){
00023 ClientInfo *ci = new ClientInfo(id, sock);
00024 int isnew ;
00025
00026 isnew = this->m_online_peers_id.insert ( std::pair<ClientInfo::ClientID,ClientInfo*>(id,ci)).second ;
00027 if(!isnew){
00028 delete ci ;
00029 return NULL ;
00030 }
00031 return ci ;
00032 }
00033
00034 int Server::delClientInfo(ClientInfo::ClientID id){
00035 std::cerr << "erased idpeer:" << std::hex << id << this->m_online_peers_id.erase(id) << std::endl ;
00036 }
00037
00038 int Server::delClientInfo(net::Socket * sock){
00039
00040 m_peers_it_id pit ;
00041 reinithack:
00042 for (pit = this->m_online_peers_id.begin(); pit != this->m_online_peers_id.end(); pit++ ){
00043 if ( pit->second->getCtlSock() == sock ){
00044 std::cerr << "del client info. removed idpeer from list:" << std::hex << pit->first << std::endl ;
00045 this->m_online_peers_id.erase(pit);
00046 goto reinithack;
00047 }
00048 }
00049 }
00050
00051
00052
00053 Server::Server() {
00054 std::cerr << "server starting" << std::endl ;
00055 }
00056
00057
00058 Server::~Server() {
00059 }
00060
00061 int Server::listen ( int port ) {
00062 this->m_sock = new n2nc::net::TcpSocket ( AF_INET );
00063 net::SocketAddress *sa = net::Resolver::getSocketAddressByService ( "0.0.0.0", port, SOCK_STREAM, AF_INET, false ) ;
00064 this->m_sock->bind ( *sa );
00065 delete sa ;
00066 this->m_sock->setListen ( 10 );
00067 this->m_skev = new net::SocketEventsHandler();
00068
00069 this->m_skev->add ( *this->m_sock, net::SocketEventsHandler::READ, *this );
00070 this->m_skev->waitForEvents();
00071 return 0;
00072 }
00073
00074
00075 int Server::shutdown ( std::string message ) {
00076
00077 }
00078
00079 }
00080
00081 int n2nc::Server::onReceive ( n2nc::net::Socket & sock, int dtlen ) {
00082
00083 packet pk_tmp, pk_tmp_reply ;
00084 m_peers_it pit;
00085 int retval ;
00086 ClientInfo *ci_tmp,*ci;
00087 net::SocketAddress *peer_sa ;
00088 net::Address *peer_a ;
00089
00090 ::bzero ( &pk_tmp, sizeof ( pk_tmp ) );
00091 if ( dtlen < sizeof ( packet ) ) {
00092 std::cerr << "malformed packet, do nothing:" << dtlen << std::endl ;
00093 ::sleep ( 1 );
00094 this->m_skev->enableSocket ( sock );
00095 return -1 ;
00096 }
00097 sock.recv ( ( void* ) &pk_tmp, sizeof ( packet ) );
00098 std::cerr << "onReceive. bytes:" << dtlen << std::endl ;
00099
00100
00101 switch(pk_tmp.cmd){
00102 case CMD_REGISTER :
00103 std::cerr << "lock in register cmd" << std::endl ;
00104 this->m_lock.lock();
00105 ci = this->newClientInfo(&sock,pk_tmp.src);
00106 ::bzero(&pk_tmp_reply,sizeof(pk_tmp_reply));
00107 pk_tmp_reply.cmd = CMD_REGISTER_ACK ;
00108 if (!ci){
00109
00110 std::cerr << "onReceive:Already registered id" << std::hex << pk_tmp.src << std::endl ;
00111 pk_tmp_reply.msg = MSG_ALREADY_REGISTERED ;
00112 }else{
00113
00114 std::cerr << "onReceive:REGISTER rsa ID:" << std::hex << pk_tmp.src << "port:" << pk_tmp.src_port << std::endl ;
00115 ci->setServicePort(pk_tmp.src_port);
00116 ci->setAckTime();
00117 pk_tmp_reply.msg = MSG_OK ;
00118 }
00119
00120 sock.send(&pk_tmp_reply,sizeof(pk_tmp_reply));
00121 this->m_lock.unlock();
00122 break ;
00123
00124 case CMD_PING :
00125 ci_tmp = this->getClientInfo(&sock);
00126
00127 if (!ci_tmp){std::cerr << "ClientInfo not set. Exit" << std::endl ; exit(255);}
00128 ci_tmp->setAckTime();
00129 break ;
00130
00131
00132 case CMD_LEAVE :
00133 break ;
00134
00135 case CMD_GET_CLIENT_INFO :
00136 std::cerr << "CMD_GET_CLIENT_INFO: requested id" << std::hex << pk_tmp.dst << std::endl ;
00137 ci_tmp = this->getClientInfo(NULL,pk_tmp.dst);
00138 bzero (&pk_tmp_reply,sizeof(pk_tmp_reply));
00139 pk_tmp_reply.cmd = CMD_GET_CLIENT_INFO_REPLY ;
00140 if (!ci_tmp){
00141 std::cerr << "Client not registered." << std::endl ;
00142 pk_tmp_reply.msg = MSG_NOT_FOUND ;
00143 }else{
00144 pk_tmp_reply.msg = MSG_OK ;
00145 pk_tmp_reply.dst = pk_tmp.dst ;
00146 peer_sa = ci_tmp->getSrvSocketAddr();
00147 memcpy(&pk_tmp_reply.srv_addr,peer_sa->getRawSockAddr(),sizeof(net::SocketAddress::Storage));
00148
00149
00150 }
00151
00152 sock.send(&pk_tmp_reply,sizeof(pk_tmp_reply));
00153 break ;
00154
00155 case CMD_CONNECT :
00156 ci_tmp = this->getClientInfo(NULL,pk_tmp.dst);
00157 if(!ci_tmp){
00158 std::cerr << "CMD_CONNECT from ID: " << std::hex << pk_tmp.src << " to: " << pk_tmp.dst << " FAILED" << std::endl ;
00159 break ;
00160 }
00161 std::cerr << "CMD_CONNECT from ID: " << std::hex << pk_tmp.src << " to: " << pk_tmp.dst << std::endl ;
00162
00163 ci_tmp->getCtlSock()->send(&pk_tmp,sizeof(pk_tmp));
00164 break ;
00165
00166 case CMD_CONNECT_ACK :
00167 ci_tmp = this->getClientInfo(NULL,pk_tmp.dst);
00168 if(!ci_tmp){
00169 std::cerr << "CMD_CONNECT_ACK from ID: " << std::hex << pk_tmp.src << " to: " << pk_tmp.dst << " FAILED" << std::endl ;
00170 break ;
00171 }
00172 std::cerr << "CMD_CONNECT_ACK from ID: " << std::hex << pk_tmp.src << " to: " << pk_tmp.dst << std::endl ;
00173
00174 ci_tmp->getCtlSock()->send(&pk_tmp,sizeof(pk_tmp));
00175 break ;
00176 case CMD_CONNECT_OK :
00177 ci_tmp = this->getClientInfo(NULL,pk_tmp.dst);
00178 if(!ci_tmp){
00179 std::cerr << "CMD_CONNECT_OK from ID: " << std::hex << pk_tmp.src << " to: " << pk_tmp.dst << " FAILED" << std::endl ;
00180 break ;
00181 }
00182 std::cerr << "CMD_CONNECT_OK from ID: " << std::hex << pk_tmp.src << " to: " << pk_tmp.dst << std::endl ;
00183
00184 ci_tmp->getCtlSock()->send(&pk_tmp,sizeof(pk_tmp));
00185 break ;
00186
00187 case CMD_CONNECT_OK_ACK :
00188 ci_tmp = this->getClientInfo(NULL,pk_tmp.dst);
00189 if(!ci_tmp){
00190 std::cerr << "CMD_CONNECT_OK_ACK from ID: " << std::hex << pk_tmp.src << " to: " << pk_tmp.dst << " FAILED" << std::endl ;
00191 break ;
00192 }
00193 std::cerr << "CMD_CONNECT_OK_ACK from ID: " << std::hex << pk_tmp.src << " to: " << pk_tmp.dst << std::endl ;
00194
00195 ci_tmp->getCtlSock()->send(&pk_tmp,sizeof(pk_tmp));
00196 break ;
00197
00198 case CMD_SMSG :
00199 ci_tmp = this->getClientInfo(NULL,pk_tmp.dst);
00200 if(!ci_tmp){
00201 std::cerr << "CMD_SMSG from ID: " << std::hex << pk_tmp.src << " to: " << pk_tmp.dst << " FAILED" << std::endl ;
00202 break ;
00203 }
00204 std::cerr << "CMD_SMSG from ID: " << std::hex << pk_tmp.src << " to: " << pk_tmp.dst << std::endl ;
00205
00206 ci_tmp->getCtlSock()->send(&pk_tmp,sizeof(pk_tmp));
00207 break ;
00208 case CMD_SMSG_ACK :
00209 ci_tmp = this->getClientInfo(NULL,pk_tmp.dst);
00210 if(!ci_tmp){
00211 std::cerr << "CMD_SMSG_ACK from ID: " << std::hex << pk_tmp.src << " to: " << pk_tmp.dst << " FAILED" << std::endl ;
00212 break ;
00213 }
00214 std::cerr << "CMD_SMSG_ACK from ID: " << std::hex << pk_tmp.src << " to: " << pk_tmp.dst << std::endl ;
00215
00216 ci_tmp->getCtlSock()->send(&pk_tmp,sizeof(pk_tmp));
00217 break ;
00218
00219 case CMD_DISCONNECT :
00220 break ;
00221
00222 }
00223
00224
00225 this->m_skev->enableSocket ( sock );
00226
00227 return retval ;
00228 }
00229
00230 int n2nc::Server::onNewConnection ( n2nc::net::Socket & sock ) {
00231 std::cerr << "new connection" << std::endl ;
00232 n2nc::net::TcpSocket *cast_sock = ( n2nc::net::TcpSocket* ) & sock ;
00233 std::cerr << "pre accepted" << std::endl ;
00234 n2nc::net::Socket *new_sock = cast_sock->accept();
00235
00236
00237 std::cerr << "accepted with new fd:" << new_sock->getFD() << std::endl ;
00238 net::SocketEventsHandler::check_for_t tmp_checkfor = ( net::SocketEventsHandler::check_for_t ) ( net::SocketEventsHandler::READ | net::SocketEventsHandler::EXCEPT );
00239 this->m_skev->add ( *new_sock , tmp_checkfor, *this );
00240 this->m_skev->enableSocket ( sock );
00241 }
00242
00243 int n2nc::Server::onWriteComplete ( n2nc::net::Socket & sock ) {
00244 std::cerr << "w complete" << std::endl ;
00245 }
00246
00247 int n2nc::Server::onClose ( n2nc::net::Socket & sock ) {
00248 std::cerr << "onClose" << errno << " from thread: " << sync::Thread::getCurrent().toString() << std::endl ;
00249 this->m_lock.lock();
00250 this->delClientInfo(&sock);
00251 this->m_skev->del ( sock );
00252 delete &sock ;
00253 this->m_lock.unlock();
00254 }
00255
00256 int n2nc::Server::onError ( n2nc::net::Socket & sock ) {
00257 std::cerr << "onError" << errno << std::endl ;
00258 std::cerr << "onClose" << EAGAIN << std::endl ;
00259 }
00260
00261 int n2nc::Server::onRawReceive ( n2nc::net::Socket & sock ) {
00262 std::cerr << "OnRawReceive" << std::endl ;
00263 }
00264
00265 int n2nc::Server::check_clients_status() {
00266 m_peers_it_id pit ;
00267 this->m_lock.lock();
00268 reinithack:
00269 for (pit = this->m_online_peers_id.begin(); pit != this->m_online_peers_id.end(); pit++ ){
00270 std::cerr << "check_client_status id: " << std::hex << pit->first << "service address: " << pit->second->getSrvSocketAddr()->toString() << std::endl ;
00271 if (! pit->second->checkStatus()){
00272
00273 std::cerr << "too idle detected.closing connection " << std::endl ;
00274 this->onClose(*(pit->second->getCtlSock()));
00275 goto reinithack ;
00276 }
00277 }
00278 this->m_lock.unlock();
00279 }
00280
00281 int n2nc::Server::show_clients(){
00282 m_peers_it_id pit ;
00283 this->m_lock.lock();
00284 for(pit = this->m_online_peers_id.begin(); pit != this->m_online_peers_id.end() ; pit++){
00285 std::cerr << "peerID: " << std::hex << pit->second->getKeyID() << " service address: " << pit->second->getSrvSocketAddr()->toString() << std::endl ;
00286 }
00287 this->m_lock.unlock();
00288
00289 }
00290
00291 int n2nc::Server::sendCommand(enum server_command cmd, net::Socket & sock){
00292 packet pk ;
00293 ::bzero(&pk,sizeof(pk));
00294 pk.cmd = cmd ;
00295 sock.send(&pk,sizeof(pk));
00296 }
00297