void Server::run() { Packet * pPacket = NULL, * pNewPacket = NULL; unsigned char * pNewMessage; int iNewMessageLength = 0; in_addr_t ipTX; std::map<in_addr_t, in_addr_t> mapNewCars; struct timeval tWait = MakeTime(SERVER_WAIT_SECS, SERVER_WAIT_USECS); std::map<in_addr_t, std::vector<Packet *> >::iterator iterPackets; std::map<in_addr_t, Buffer>::iterator iterBuffer; std::map<in_addr_t, CarModel *> * pCarRegistry; std::map<in_addr_t, InfrastructureNodeModel *> * pNodeRegistry; std::map<in_addr_t, CarModel *>::iterator iterCarReceiver; std::map<in_addr_t, InfrastructureNodeModel *>::iterator iterNode; struct timeval tRX; char iRSSI, iSNR; fd_set rfds; std::list<ReadBuffer> listRead; std::list<ReadBuffer>::iterator iterRead; while (!m_bCancelled) { // get any waiting messages m_mutexConnections.lock(); if (FillFDs(&rfds) && Select(&rfds, tWait)) { Read(&rfds, listRead); for (iterRead = listRead.begin(); iterRead != listRead.end(); ++iterRead) { ipTX = ntohl(iterRead->sFrom.sin_addr.s_addr); // if new message is not null, add it to the current buffer if (iterRead->pData != NULL) m_mapBuffers[ipTX] += Buffer(iterRead->pData, iterRead->iLength); } listRead.clear(); } m_mutexConnections.unlock(); // process non-empty buffers into messages for (iterBuffer = m_mapBuffers.begin(); iterBuffer != m_mapBuffers.end(); ++iterBuffer) { if (iterBuffer->second.m_iLength > 0) { //printf("processing buffer..........\n"); //fflush(stdout); unsigned char * pNew = NULL; pCarRegistry = g_pCarRegistry->acquireLock(); pNodeRegistry = g_pInfrastructureNodeRegistry->acquireLock(); m_mutexBuffers.lock(); pNewMessage = iterBuffer->second.m_pData; iNewMessageLength = (signed)iterBuffer->second.m_iLength; tRX = GetCurrentTime(); iRSSI = rssi(); iSNR = snr(); while (iNewMessageLength >= (signed)PACKET_MINIMUM_LENGTH && (pPacket = CreatePacket(*(const PacketType *)pNewMessage)) != NULL) { //printf("got packet...\n"); if (!pPacket->FromBytes(pNewMessage, iNewMessageLength)) { //printf("failed...\n"); DestroyPacket(pPacket); iNewMessageLength = 0; break; } //if(((SafetyPacket*)pPacket)->m_ePacketType == ptSafety) // printf("data: %s\n", ((SafetyPacket*)pPacket)->m_pData); //if(((Packet*)pPacket)->m_ePacketType == ptGeneric) // printf("long: %ld\n", ((Packet*)pPacket)->m_ptTXPosition.m_iLong); // add it to the proper message buffer pPacket->m_tRX = tRX; pPacket->m_iRSSI = iRSSI; pPacket->m_iSNR = iSNR; pNewPacket = pPacket->clone(); for (iterCarReceiver = pCarRegistry->begin(); iterCarReceiver != pCarRegistry->end(); ++iterCarReceiver) { if (iterCarReceiver->second != NULL && iterCarReceiver->second->GetOwnerIPAddress() == CARMODEL_IPOWNER_LOCAL && iterCarReceiver->first != pPacket->m_ipTX) { pNewPacket->m_ipRX = iterCarReceiver->first; iterCarReceiver->second->ReceivePacket(pNewPacket); } } for (iterNode = pNodeRegistry->begin(); iterNode != pNodeRegistry->end(); ++iterNode) { if (iterNode->second != NULL && iterNode->first != pPacket->m_ipTX) { pNewPacket->m_ipRX = iterNode->first; iterNode->second->ReceivePacket(pNewPacket); } } DestroyPacket(pNewPacket); iterCarReceiver = pCarRegistry->find(pPacket->m_ID.srcID.ipCar); iterNode = pNodeRegistry->find(pPacket->m_ID.srcID.ipCar); if ((iterCarReceiver == pCarRegistry->end() || iterCarReceiver->second == NULL || iterCarReceiver->second->GetOwnerIPAddress() != CARMODEL_IPOWNER_LOCAL) && (iterNode == pNodeRegistry->end() || iterNode->second == NULL)) { //printf("processing..................................\n"); mapNewCars[pPacket->m_ID.srcID.ipCar] = iterBuffer->first; iterPackets = m_mapPackets.find(pPacket->m_ID.srcID.ipCar); if (iterPackets == m_mapPackets.end()) iterPackets = m_mapPackets.insert(std::pair<in_addr_t, std::vector<Packet *> >(pPacket->m_ID.srcID.ipCar, std::vector<Packet *>())).first; iterPackets->second.push_back(pPacket); push_heap(iterPackets->second.begin(), iterPackets->second.end(), ComparePacketPtrs); } else DestroyPacket(pPacket); } m_mutexBuffers.unlock(); g_pInfrastructureNodeRegistry->releaseLock(); g_pCarRegistry->releaseLock(); if (iNewMessageLength > 0) pNew = (unsigned char *)memcpy(malloc(iNewMessageLength), pNewMessage, iNewMessageLength); iterBuffer->second = Buffer(pNew, iNewMessageLength); } } //add new network car to list if (!mapNewCars.empty()) { g_pSimulator->m_ModelMgr.AddNetworkCars(mapNewCars); mapNewCars.clear(); } //sleep(1); } }