Beispiel #1
0
void Socket::check_timeouts()
{
    UTP_CheckTimeouts();
}
void CUTPSocketListner::Process()
{
	/*int microsec = 0;
	struct timeval tv = {microsec / 1000000, microsec % 1000000};
	fd_set r, e;
	FD_ZERO(&r);
	FD_ZERO(&e);
	FD_SET(m_Socket, &r);
	FD_SET(m_Socket, &e);
	int ret = ::select(m_Socket + 1, &r, 0, &e, &tv);
	if (ret == 0) 
		return;

	if (ret < 0) 
	{
		LogLine(LOG_ERROR, L"UTP - UDP select() failed: %S\n", strerror(errno));
		return;
	}

	if (FD_ISSET(m_Socket, &r))*/
	{
		byte buffer[0xFFFF];
		sockaddr_in6 sa; // sockaddr_in is smaller
		socklen_t sa_len = sizeof(sa);

		for (;;) 
		{
			int len = recvfrom(m_Socket, (char*)buffer, sizeof(buffer), 0, (struct sockaddr*)&sa, &sa_len);
			if (len < 0) 
			{
				int err = WSAGetLastError();
				// ECONNRESET - On a UDP-datagram socket
				// this error indicates a previous send operation
				// resulted in an ICMP Port Unreachable message.
				if (err == ECONNRESET) 
					continue;
				// EMSGSIZE - The message was too large to fit into
				// the buffer pointed to by the buf parameter and was
				// truncated.
				if (err == EMSGSIZE) 
					continue;
				// any other error (such as EWOULDBLOCK) results in breaking the loop
				break;
			}

			Recv(buffer, len, (struct sockaddr*)&sa, sa_len);
		}
	}
	/*if (FD_ISSET(m_Socket, &e)) 
		LogLine(LOG_ERROR, L"UTP - UDP socket error!\n");*/

	UTP_CheckTimeouts();

	uint64 uNow = GetCurTick();
	if(m_NextCleanUp < uNow) // cleanup interval once per minute
	{
		m_NextCleanUp = uNow + CLEANUP_INTERVAL;
		TKeyMap SendKeys = m_SendKeys;

		const list<CObject*>& Children = GetChildren();
		for(list<CObject*>::const_iterator I = Children.begin(); I != Children.end(); I++)
		{
			ASSERT((*I)->Inherits(CUTPSocketSession::StaticName()));
			CUTPSocketSession* pSession = (CUTPSocketSession*)*I;

			sockaddr_in6 sa; // sockaddr_in is smaller
			int sa_len = sizeof(sa);
			pSession->GetAddress().ToSA((sockaddr*)&sa, &sa_len);
		
			TKeyMap::iterator J = SendKeys.find((struct sockaddr*)&sa);
			if(J != SendKeys.end())
				SendKeys.erase(J);
		}

		for(TKeyMap::iterator J = SendKeys.begin(); J != SendKeys.end(); J++)
		{
			TKeyMap::iterator K = m_SendKeys.find(J->first);
			if(K != m_SendKeys.end() && K->second->LastActivity + CLEANUP_INTERVAL/2 < uNow)
			{
				SPassKey* pSendKey = K->second;
				m_SendKeys.erase(K);
				delete pSendKey;
			}
		}
	}
}