Esempio n. 1
0
int CLocalSearch::ExecuteSharedFiles(int nMaximum)
{
	CQuickLock oLock( Library.m_pSection );
	CPtrList* pFiles = Library.Search( m_pSearch, nMaximum );
	if ( pFiles == NULL ) return 0;

	int nHits = pFiles->GetCount();

	while ( pFiles->GetCount() )
	{
		int nInThisPacket = min( pFiles->GetCount(), (int)Settings.Gnutella.HitsPerPacket );

		CreatePacket( nInThisPacket );

        int nHitB = 0;
		for ( int nHitA = 0 ; nHitA < nInThisPacket ; nHitA++ )
		{
			CLibraryFile* pFile = (CLibraryFile*)pFiles->RemoveHead();
			if ( AddHit( pFile, nHitB ) ) nHitB ++;
		}

		WriteTrailer();
		if ( nHitB > 0 ) DispatchPacket(); else DestroyPacket();
	}

	delete pFiles;

	return nHits;
}
Esempio n. 2
0
Server::~Server()
{
	std::map<in_addr_t, std::vector<Packet *> >::iterator iterPackets;
	unsigned int i;
	for (iterPackets = m_mapPackets.begin(); iterPackets != m_mapPackets.end(); ++iterPackets)
	{
		for (i = 0; i < iterPackets->second.size(); i++)
			DestroyPacket(iterPackets->second[i]);
	}
}
Esempio n. 3
0
void McuMessageHandler::SendBody(StruMcuPacket *packet, unsigned short id)
{
    if((m_handshake == false) && (id != MCU_PACKET_HANDSHAKE))
    {
        LogUtility::Log(LOG_LEVEL_WARN, "McuMessageHandler::SendBody not handshake yet");
        DestroyPacket(packet);
        return;
    }
    
    McuPacket &content = packet->packet;
    if(content.size() > MCU_MAX_CONTENT_SIZE)
    {
        LogUtility::Log(LOG_LEVEL_DEBUG, "McuMessageHandler::SendBody too large");
        DestroyPacket(packet);
        return;
    }
    PacketHead(packet, (unsigned short)id);
    PacketCheckSumFlag(packet);
    PushQueue(packet);
}
Esempio n. 4
0
void CarModel::TransmitPacket(const Packet * packet)
{
	std::vector<CarModel *> vecCars;
	std::map<in_addr_t, InfrastructureNodeModel *> * pNodeRegistry;
	std::map<in_addr_t, InfrastructureNodeModel *>::iterator iterNode;
	unsigned int iBytesPerSec = GetTXRate();
	struct timeval tTransmit = iBytesPerSec > 0 ? MakeTime((double)packet->GetLength() / iBytesPerSec) : timeval0;
	unsigned int i;
	Packet * pNewPacket = packet->clone();

	// transmit message to all local cars, as well as to infrastructure nodes
	g_pCarRegistry->acquireLock();
	g_pCarRegistry->GetLocalCars(vecCars);

	for (i = 0; i < vecCars.size(); i++) {
		if (vecCars[i]->GetIPAddress() == packet->m_ID.srcID.ipCar || vecCars[i]->GetIPAddress() == m_ipCar)
			continue;

		pNewPacket->m_ipRX = vecCars[i]->GetIPAddress();
		pNewPacket->m_tRX = pNewPacket->m_tTX + tTransmit;
		pNewPacket->m_iRSSI = PACKET_RSSI_UNAVAILABLE;
		pNewPacket->m_iSNR = PACKET_SNR_UNAVAILABLE;
		vecCars[i]->ReceivePacket(pNewPacket);
	}
	g_pCarRegistry->releaseLock();

	if (m_pCommModel != NULL && m_pCommModel->IsGateway())
	{
		pNodeRegistry = g_pInfrastructureNodeRegistry->acquireLock();
		for (iterNode = pNodeRegistry->begin(); iterNode != pNodeRegistry->end(); ++iterNode)
		{
			if (iterNode->second != NULL)
			{
				pNewPacket->m_ipRX = iterNode->first;
				pNewPacket->m_tRX = pNewPacket->m_tTX + tTransmit;
				pNewPacket->m_iRSSI = PACKET_RSSI_UNAVAILABLE;
				pNewPacket->m_iSNR = PACKET_SNR_UNAVAILABLE;
				iterNode->second->ReceivePacket(pNewPacket);
			}
		}
		g_pInfrastructureNodeRegistry->releaseLock();
	}

	// transmit message to all remaining network cars
	pNewPacket->m_ipRX = 0;
	pNewPacket->m_tRX = timeval0;
	pNewPacket->m_iRSSI = PACKET_RSSI_UNAVAILABLE;
	pNewPacket->m_iSNR = PACKET_SNR_UNAVAILABLE;
	SendPacketToAll(pNewPacket);
	AddHybridPacket((Packet*)packet);
	DestroyPacket(pNewPacket);
}
Esempio n. 5
0
void McuMessageHandler::ClearQueue()
{
    pthread_mutex_lock(&m_queueMutex);

    for(McuPacketFifo::iterator it = m_waitingQueue.begin(); it != m_waitingQueue.end(); it ++)
    {
        StruMcuPacket *packet = *it;
        DestroyPacket(packet);
    }
    m_waitingQueue.clear();

    pthread_mutex_unlock(&m_queueMutex);
}
Esempio n. 6
0
void SendPacketToAll(const Packet * packet)
{
	std::map<in_addr_t, Client *>::iterator iterConnection;
	std::map<in_addr_t, Packet *>::iterator iterMapSendPackets;
	unsigned char * pBuffer;
	int iLength = 0;

	//TODO: ignore calls if not connected to any clients

	if(time(NULL) >= lastUpdateTime+1) //if it's time to send the packets
	{
		g_mutexClients.lock();
		//loop over the map
		for(iterMapSendPackets = mapSendPackets.begin(); iterMapSendPackets != mapSendPackets.end(); iterMapSendPackets++)
		{
			dbgprint("*");
			pBuffer = iterMapSendPackets->second->ToBytes(iLength);
			if (pBuffer == NULL)
			{
				g_mutexClients.unlock();
				return;
			}
		
			for (iterConnection = g_mapClients.begin(); iterConnection != g_mapClients.end(); ++iterConnection)
			{
				if (iterConnection->first == iterMapSendPackets->second->m_ID.srcID.ipCar)
					continue;
		
				// change header for each client
				*((in_addr_t *)(pBuffer + PACKET_IPRX_OFFSET)) = iterConnection->first;
		
				if (iterConnection->second != NULL && iterConnection->second->Select())
					iterConnection->second->Write(pBuffer, iLength);
			}
			free(pBuffer);
			DestroyPacket(iterMapSendPackets->second);
		}
		g_mutexClients.unlock();
		lastUpdateTime = time(NULL);
		mapSendPackets.clear();
	}
	else //not time to send yet
	{
		dbgprint("-");
		//add packets to map. be sure to clone
		mapSendPackets[packet->m_ipTX] = packet->clone();
	}
}
Esempio n. 7
0
int McuMessageHandler::PopQueue(int id, int seq, unsigned long *data, unsigned long *data2)
{
    int ret = 0;
    pthread_mutex_lock(&m_queueMutex);

    if(m_waitingQueue.size() <= 0)
    {
        LogUtility::Log(LOG_LEVEL_ERROR, "McuMessageHandler::PopQueue waiting queue empty.");
        pthread_mutex_unlock(&m_queueMutex);
        return -1;
    }

    StruMcuPacket *packet = *(m_waitingQueue.begin());
    
    if((packet->id == id) && (packet->seq == seq))
    {
        LogUtility::Log(LOG_LEVEL_DEBUG, "McuMessageHandler::PopQueue correct resp.");
        if(data)
        {
            *data = packet->data;
        }
        if(data2)
        {
            *data2 = packet->data2;
        }
        m_waitingQueue.pop_front();
        DestroyPacket(packet);
        StopTimer(m_retryTimer);
        if(m_waitingQueue.size() > 0)
        {
            LogUtility::Log(LOG_LEVEL_DEBUG, "McuMessageHandler::PopQueue send queue");
            SendQueue();
        }
    }
    else
    {
        LogUtility::Log(LOG_LEVEL_ERROR, "McuMessageHandler::PopQueue incorrect resp(%d, %04x).", packet->seq, packet->id);
        ret = -1;
    }
    
    pthread_mutex_unlock(&m_queueMutex);
    
    return ret;
}
Esempio n. 8
0
int McuMessageHandler::PushQueue(StruMcuPacket *packet)
{
    pthread_mutex_lock(&m_queueMutex);
    if(m_waitingQueue.size() >= MCU_MAX_WAITING_QUEUE)
    {
        LogUtility::Log(LOG_LEVEL_DEBUG, "McuMessageHandler::PushQueue full");
        pthread_mutex_unlock(&m_queueMutex);
        DestroyPacket(packet);
        return -1;
    }
    m_waitingQueue.push_back(packet);
    if(m_waitingQueue.size() == 1)
    {
        LogUtility::Log(LOG_LEVEL_DEBUG, "McuMessageHandler::PushQueue empty");
        SendQueue();
    }
    pthread_mutex_unlock(&m_queueMutex);
    return 0;
}
//队列发送,分为音频队列和视频队列发送
static int SendDataToAvQueue(AvManager *Manager,void *data)
{
	if(!Manager || !data)
		return QUEUE_ERROR;

	int type = GetPacketAttr(data);

	MediaPacket *mpkt = (MediaPacket*)data;

	if(Manager->masterClkByAV == NONE  && type != NONE)
	{
		Manager->masterClkByAV = type;

		switch(type)
		{
		case AUDIO:
			printf("Auido first!\n");
			break;
		case VIDEO:
			printf("Video first\n");
			break;
		}
	}

	if(mpkt->size > 0)
	{
		if(Manager->playAudio && type == AUDIO)
		{
			PutDataToTail(Manager->MediaAudio,mpkt);
		}
		else if(Manager->playVideo && type == VIDEO)
		{
			PutDataToTail(Manager->MediaVideo,mpkt);
		}
		else
			DestroyPacket(mpkt);
	}

	return QUEUE_ERROR;
}
Esempio n. 10
0
void McuMessageHandler::HandleRetryTimer(void *)
{
    pthread_mutex_lock(&m_queueMutex);

    if(m_waitingQueue.size() <= 0)
    {
        LogUtility::Log(LOG_LEVEL_DEBUG, "McuMessageHandler::HandleRetryTimer empty");
        pthread_mutex_unlock(&m_queueMutex);
        return ;
    }

    StruMcuPacket *packet = *(m_waitingQueue.begin());
    if(packet->retry > MCU_MAX_RETRY_TIMES)
    {
        LogUtility::Log(LOG_LEVEL_DEBUG, "McuMessageHandler::HandleRetryTimer %d reach limit", packet->id);
        m_waitingQueue.pop_front();
        if((packet->id == MCU_POS_GET_PASSENGER) || (packet->id == MCU_POS_GET_DEAL))
        {
            int index = packet->data2;
            m_passengerRecord[index].state = STATE_TIMER;
            StartTimer(m_passengerRecord[index].posPassengerRecordTimer);
        }
        DestroyPacket(packet);
        if(m_waitingQueue.size() > 0)
        {
            LogUtility::Log(LOG_LEVEL_DEBUG, "McuMessageHandler::HandleRetryTimer proceed to next message");
            SendQueue();
        }
    }
    else
    {
        SendPacket(packet);
        packet->retry ++;
        StartTimer(m_retryTimer);
    }
    
    pthread_mutex_unlock(&m_queueMutex);
}
Esempio n. 11
0
int CarModel::ProcessEvent(SimEvent & event)
{
	if (Model::ProcessEvent(event))
		return 1;

	switch (event.GetEventID())
	{
	case EVENT_CARMODEL_UPDATE:
	{
		if (m_pPhysModel != NULL)
			m_pPhysModel->DoUpdate(event.GetTimestamp());
		if (m_pLinkModel != NULL)
			m_pLinkModel->DoUpdate(event.GetTimestamp());
		if (m_pCommModel != NULL)
			m_pCommModel->DoUpdate(event.GetTimestamp());

		std::map<in_addr_t, SafetyPacket>::iterator iterCarMessage = m_mapKnownVehicles.begin();
		while (iterCarMessage != m_mapKnownVehicles.end())
		{
			if (iterCarMessage->second.m_tTime + MakeTime(NETWORK_TIMEOUT_SECS, NETWORK_TIMEOUT_USECS) < event.GetTimestamp()) {
				std::map<in_addr_t, SafetyPacket>::iterator iterCarMessageTemp = iterCarMessage;
				++iterCarMessage;
				m_mapKnownVehicles.erase(iterCarMessageTemp);
			} else
				++iterCarMessage;
		}

		if (IsActive())
		{
			std::vector<CarModel *> vecNeighbors;
			g_pCarRegistry->GetCommunicatingCarsInRange(this, vecNeighbors);
			m_msgNeighbors.tMessage = m_tTimestamp;
			m_msgNeighbors.iNeighbors = vecNeighbors.size();
			m_msgNeighbors.iCollisionCount = m_pPhysModel != NULL ? (m_pPhysModel->GetCollisionCount() - m_msgNeighbors.iAccumulatedCollisions) : 0;
			m_msgNeighbors.iAccumulatedCollisions += m_msgNeighbors.iCollisionCount;
			m_msgNeighbors.iMessages = m_pPhysModel != NULL ? (m_pPhysModel->GetMessageCount() - m_msgNeighbors.iAccumulatedMessages) : 0;
			m_msgNeighbors.iAccumulatedMessages += m_msgNeighbors.iMessages;
#ifdef MULTILANETEST
			m_msgNeighbors.iLane = m_iLane;
#endif
	
			if (m_msgNeighbors.iCollisionCount > 0 || m_msgNeighbors.iMessages > 0 || m_msgNeighbors.iNeighbors > 0)
				g_pLogger->WriteMessage(LOGFILE_NEIGHBORS, &m_msgNeighbors);
		}
		event.SetTimestamp(event.GetTimestamp() + m_tDelay);
		g_pSimulator->m_EventQueue.AddEvent(event);
		break;
	}
	case EVENT_CARMODEL_RXMESSAGEBEGIN:
	{
		Packet * pPacket = (Packet *)event.GetEventData();
		bool bValid = (pPacket != NULL);
		if (bValid && m_pCommModel != NULL && pPacket->m_ePacketType == ptSafety)
			m_pCommModel->AddMessageToHistory(*(SafetyPacket *)pPacket);
		if (bValid && m_pPhysModel != NULL)
			bValid = m_pPhysModel->BeginProcessPacket(pPacket);
		if (bValid && m_pLinkModel != NULL)
			bValid = m_pLinkModel->BeginProcessPacket(pPacket);
		if (bValid)
			g_pSimulator->m_EventQueue.AddEvent(SimEvent(pPacket->m_tRX, EVENT_PRIORITY_HIGHEST, QString::null, m_strModelName, EVENT_CARMODEL_RXMESSAGEEND, pPacket, DestroyPacket));
		else
			DestroyPacket(pPacket);
		break;
	}
	case EVENT_CARMODEL_RXMESSAGEEND:
	{
		std::map<in_addr_t, SafetyPacket>::iterator iterCarMessage;
		std::map<PacketSequence, Event1Message>::iterator iterEvent1Message;
		Packet * pPacket = (Packet *)event.GetEventData();
		// process messages in the order that they were received
		bool bValid = pPacket != NULL && m_pPhysModel != NULL && m_pPhysModel->EndProcessPacket(pPacket);

		if (bValid)
			bValid = m_pLinkModel != NULL && m_pLinkModel->EndProcessPacket(pPacket);

		if (bValid)
		{
			switch (pPacket->m_ePacketType)
			{
			case ptGeneric:
			{
				Packet * pMsg = (Packet *)pPacket;
				// received message successfully
				//g_pLogger->LogInfo(QString("%1> ***Generic Packet\n").arg(IPAddressToString(pMsg->m_ID.srcID.ipCar)));

				g_pLogger->WriteMessage(LOGFILE_MESSAGES, pMsg);
				g_pSimulator->m_mutexEvent1Log.lock();
				if ((iterEvent1Message = g_pSimulator->m_mapEvent1Log.find(pMsg->m_ID.srcID)) != g_pSimulator->m_mapEvent1Log.end())
					iterEvent1Message->second.iCars++;
				g_pSimulator->m_mutexEvent1Log.unlock();
				break;
			}
			case ptSafety:
			{
				SafetyPacket * pMsg = (SafetyPacket *)pPacket;
				// received message successfully
				g_pLogger->LogInfo(QString("%1> ***Safety: %2\n").arg(IPAddressToString(pMsg->m_ID.srcID.ipCar)).arg((const char *)pMsg->m_pData));
				if((const char *)pMsg->m_pData != NULL)
					m_pMessageList->addMessage(QString("<SafetyPacket from %1 received by %2>  %3").arg(IPAddressToString(pMsg->m_ID.srcID.ipCar)).arg(IPAddressToString(pMsg->m_ipRX)).arg((const char *)pMsg->m_pData));
				if (m_pCommModel)
					m_pCommModel->AddMessageToRebroadcastQueue(*pMsg);
				g_pLogger->WriteMessage(LOGFILE_MESSAGES, pMsg);
				g_pSimulator->m_mutexEvent1Log.lock();
				if ((iterEvent1Message = g_pSimulator->m_mapEvent1Log.find(pMsg->m_ID.srcID)) != g_pSimulator->m_mapEvent1Log.end())
					iterEvent1Message->second.iCars++;
				g_pSimulator->m_mutexEvent1Log.unlock();
				break;
			}
			default:
				break;
			}
			m_pLinkModel->AddReceivedPacket(pPacket);
		}

		DestroyPacket(pPacket);
		break;
	}
	default:
		break;
	}

	return 0;
}
Esempio n. 12
0
//刷新显示线程
void *RenderAudio(void *arg)
{
	if(!arg)
		return NULL;

	AvManager *manager = (AvManager*)arg;
	MediaPacket spkt;
	long avsize = 0;
	int ret = 0;

	//只有在没有停止信号下,才能不断地读取数据
	for(;manager->avState != STOP;)
	{
		//如果是暂停且没有快进时,才可以不断等待
		if(manager->avState == PAUSE && !manager->avSeek)
		{
			usSleep(DEFAULT_AV_WAIT);
			continue;
		}

		ret = RecvDataFromAvQueue(manager->MediaAudio,&spkt);

		if(ret < 0)
		{
			usSleep(DEFAULT_AV_WAIT);
			continue;			
		}

		if(manager->avSeek && !IsHardWareAccel())
		{
			FlushBuffers(AUDIO);
			DestroyPacket(&spkt);
			continue;
		}

		if(manager->audioDelay)
		{
			usSleep(manager->audioDelay);
			manager->audioDelay = 0;
		}

		if(spkt.data && spkt.size > 0)
		{
			void *abuf = DecodeAudioStream(&spkt,&avsize);

			//播放音乐
			if(abuf && avsize > 0)
			{
				PlayWave(abuf,avsize);

				//声音时间戳部分
				manager->audioClock = (double)avsize/(double)manager->audioBasePara;

				if(spkt.pts != AV_NOPTS_VALUE)
					manager->playerClock = AVTimeToSecond(spkt.pts,manager->audioTimeBase) + manager->audioClock;
				else
					manager->playerClock += manager->audioClock;

				manager->last_audio_pts = manager->playerClock;

			}
		}
		else
			FreeAlloc(spkt.data);		
	}

	return NULL;
}
Esempio n. 13
0
int CarModel::ProcessEvent(SimEvent & event)
{
	if (Model::ProcessEvent(event))
		return 1;

	switch (event.GetEventID())
	{
	case EVENT_CARMODEL_UPDATE:
	{
		if (m_pPhysModel != NULL)
			m_pPhysModel->DoUpdate(event.GetTimestamp());
		if (m_pLinkModel != NULL)
			m_pLinkModel->DoUpdate(event.GetTimestamp());
		if (m_pCommModel != NULL)
			m_pCommModel->DoUpdate(event.GetTimestamp());

		std::map<in_addr_t, SafetyPacket>::iterator iterCarMessage = m_mapKnownVehicles.begin();
		while (iterCarMessage != m_mapKnownVehicles.end())
		{
			if (iterCarMessage->second.m_tTime + MakeTime(NETWORK_TIMEOUT_SECS, NETWORK_TIMEOUT_USECS) < event.GetTimestamp()) {
				std::map<in_addr_t, SafetyPacket>::iterator iterCarMessageTemp = iterCarMessage;
				++iterCarMessage;
				m_mapKnownVehicles.erase(iterCarMessageTemp);
			} else
				++iterCarMessage;
		}

		if (IsActive())
		{
			std::vector<CarModel *> vecNeighbors;
			g_pCarRegistry->GetCommunicatingCarsInRange(this, vecNeighbors);
			m_msgNeighbors.tMessage = m_tTimestamp;
			m_msgNeighbors.iNeighbors = vecNeighbors.size();
			m_msgNeighbors.iCollisionCount = m_pPhysModel != NULL ? (m_pPhysModel->GetCollisionCount() - m_msgNeighbors.iAccumulatedCollisions) : 0;
			m_msgNeighbors.iAccumulatedCollisions += m_msgNeighbors.iCollisionCount;
			m_msgNeighbors.iMessages = m_pPhysModel != NULL ? (m_pPhysModel->GetMessageCount() - m_msgNeighbors.iAccumulatedMessages) : 0;
			m_msgNeighbors.iAccumulatedMessages += m_msgNeighbors.iMessages;
#ifdef MULTILANETEST
			m_msgNeighbors.iLane = m_iLane;
#endif
	
			if (m_msgNeighbors.iCollisionCount > 0 || m_msgNeighbors.iMessages > 0 || m_msgNeighbors.iNeighbors > 0)
				g_pLogger->WriteMessage(LOGFILE_NEIGHBORS, &m_msgNeighbors);
		}
		event.SetTimestamp(event.GetTimestamp() + m_tDelay);
		g_pSimulator->m_EventQueue.AddEvent(event);
		break;
	}
	case EVENT_CARMODEL_RXMESSAGEBEGIN:
	{
		Packet * pPacket = (Packet *)event.GetEventData();
		bool bValid = (pPacket != NULL);
		if (bValid && m_pCommModel != NULL && pPacket->m_ePacketType == ptSafety)
			m_pCommModel->AddMessageToHistory(*(SafetyPacket *)pPacket);
		if (bValid && m_pPhysModel != NULL)
			bValid = m_pPhysModel->BeginProcessPacket(pPacket);
		if (bValid && m_pLinkModel != NULL)
			bValid = m_pLinkModel->BeginProcessPacket(pPacket);
		if (bValid)
			g_pSimulator->m_EventQueue.AddEvent(SimEvent(pPacket->m_tRX, EVENT_PRIORITY_HIGHEST, QString::null, m_strModelName, EVENT_CARMODEL_RXMESSAGEEND, pPacket, DestroyPacket));
		else
			DestroyPacket(pPacket);
		break;
	}
	case EVENT_CARMODEL_RXMESSAGEEND:
	{
		std::map<in_addr_t, SafetyPacket>::iterator iterCarMessage;
		std::map<PacketSequence, Event1Message>::iterator iterEvent1Message;
		Packet * pPacket = (Packet *)event.GetEventData();
		// process messages in the order that they were received
		bool bValid = pPacket != NULL && m_pPhysModel != NULL && m_pPhysModel->EndProcessPacket(pPacket);

		if (bValid)
			bValid = m_pLinkModel != NULL && m_pLinkModel->EndProcessPacket(pPacket);

		if (bValid)
		{
			switch (pPacket->m_ePacketType)
			{
			case ptGeneric:
			{
				Packet * pMsg = (Packet *)pPacket;
				// received message successfully
				//g_pLogger->LogInfo(QString("%1> ***Generic Packet\n").arg(IPAddressToString(pMsg->m_ID.srcID.ipCar)));

				g_pLogger->WriteMessage(LOGFILE_MESSAGES, pMsg);
				g_pSimulator->m_mutexEvent1Log.lock();
				if ((iterEvent1Message = g_pSimulator->m_mapEvent1Log.find(pMsg->m_ID.srcID)) != g_pSimulator->m_mapEvent1Log.end())
					iterEvent1Message->second.iCars++;
				g_pSimulator->m_mutexEvent1Log.unlock();
				break;
			}
			case ptSafety:
			{
				SafetyPacket * pMsg = (SafetyPacket *)pPacket;
				//printf("m_iLane = %u m_iHeading = %d", m_iLane, m_iHeading);
				// received message successfully
				if((sin( pMsg->m_iHeading * 3.14/18000) * sin( m_iHeading * 3.14/18000) + cos( pMsg->m_iHeading *3.14/18000)* cos( m_iHeading *3.14/18000) >= 0) && ((  m_ptPosition.m_iLong - pMsg->m_ptPosition.m_iLong ) * sin( pMsg->m_iHeading * 3.14/18000)  + (m_ptPosition.m_iLat - pMsg->m_ptPosition.m_iLat) * cos( pMsg->m_iHeading *3.14/18000) > 0))
					break;

				if (!QString((const char*)pMsg->m_pData).contains (QString("@%1 ").arg(IPAddressToString(pMsg->m_ipRX)))){
				if((const char *)pMsg->m_pData != NULL){
				        time_t  timer = time(NULL);
    					printf("%s  ", ctime(&timer));
					g_pLogger->LogInfo(QString("[From %1 Receiv %2: %3]\n").arg(IPAddressToString(pMsg->m_ID.srcID.ipCar)).arg(IPAddressToString(pMsg->m_ipRX)).arg((const char *)pMsg->m_pData).ascii());
					QString temp = QString("%1@%2 ").arg((const char *)pMsg->m_pData).arg(IPAddressToString(pMsg->m_ipRX));
					free(pMsg->m_pData);
					unsigned char * temp_c_string = (unsigned char *)calloc (temp.length()+1, sizeof(unsigned char));
   					const char * const_c_string = temp.ascii();
					for (int i = 0 ; i < temp.length(); i++) temp_c_string[i]=const_c_string[i];
					temp_c_string[temp.length()] = '\0';
					pMsg->m_pData = temp_c_string;
					pMsg->m_iDataLength = sizeof(unsigned char)*(temp.length()+1);

				}

				if (m_pCommModel)
					m_pCommModel->AddMessageToRebroadcastQueue(*pMsg);
				g_pLogger->WriteMessage(LOGFILE_MESSAGES, pMsg);
				g_pSimulator->m_mutexEvent1Log.lock();
				if ((iterEvent1Message = g_pSimulator->m_mapEvent1Log.find(pMsg->m_ID.srcID)) != g_pSimulator->m_mapEvent1Log.end())
					iterEvent1Message->second.iCars++;
				g_pSimulator->m_mutexEvent1Log.unlock();
				}

				break;
			}
			default:
				break;
			}
			m_pLinkModel->AddReceivedPacket(pPacket);
		}

		DestroyPacket(pPacket);
		break;
	}
	default:
		break;
	}

	return 0;
}
Esempio n. 14
0
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);
	}
}