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; } } } }