//------------------------------------------------------------------------------ // Delete a socket/port connection from this UM. // ioSock (in) - socket/port connection to be deleted //------------------------------------------------------------------------------ void UmModuleIPs::delSocketConn( const IOSocket& ioSock ) { boost::mutex::scoped_lock lock( fUmModuleMutex ); for (unsigned int i=0; i<fUmIPSocketConns.size(); ++i) { sockaddr sa = ioSock.sa(); const sockaddr_in* sinp = reinterpret_cast<const sockaddr_in*>(&sa); if (fUmIPSocketConns[i]->ipAddress() == sinp->sin_addr.s_addr) { #ifdef MOD_CONN_DEBUG std::ostringstream oss; oss << "UM " << fUmModuleName << "; deleting connection "<< ioSock.toString() << std::endl; std::cout << oss.str(); #endif fUmIPSocketConns[i]->delSocketConn ( ioSock ); //..If we just deleted the last connection for this IP, then ad- // vance fNextUmIPSocketIdx to an IP address having connections. if (fUmIPSocketConns[i]->count() == 0) { advanceToNextIP(); } break; } } }
//------------------------------------------------------------------------------ // Get the next socket/port connection belonging to the same UM as ios. // The selected socket/port connection will be returned in outIos. It can // then be used for sending the next response message back to the applicable // UM module. // ios (in) - socket/port connection where a UM request originated from // outIos (out) - socket/port connection to use in sending the // corresponding response // writelock (out) - mutex lock to be used when writing to outIos // return - bool indicating if socket/port connection was assigned to // outIos //------------------------------------------------------------------------------ bool UmSocketSelector::nextIOSocket( const IOSocket& ios, SP_UM_IOSOCK& outIos, SP_UM_MUTEX& writeLock ) { sockaddr sa = ios.sa(); const sockaddr_in* sinp = reinterpret_cast<const sockaddr_in*>(&sa); IpAddressUmMap_t::iterator mapIter = fIpAddressUmMap.find ( sinp->sin_addr.s_addr ); if ( mapIter != fIpAddressUmMap.end() ) { unsigned int umIdx = mapIter->second; if (fUmModuleIPs[umIdx]->nextIOSocket( outIos, writeLock )) { #ifdef SEL_CONN_DEBUG std::ostringstream oss; oss << "UM " << fUmModuleIPs[umIdx]->moduleName() << "; in: " << ios.toString() << "; selected out: " << outIos->toString() << std::endl; std::cout << oss.str(); #endif return true; } } //..This should not happen. Application is asking for next socket/port for // a connection not in our UM module list. return false; }