unsigned Socket::receive(void *data, const unsigned maxlen) { if(_myTimeOut) { struct timeval tv; fd_set readset; FD_ZERO(&readset); #if defined(_MSC_VER) #pragma warning(push,1) #endif //defined(_MSC_VER) FD_SET(fd, &readset); #if defined(_MSC_VER) #pragma warning(pop) #endif //defined(_MSC_VER) // Initialize time out struct tv.tv_sec = getConnectionTimeout(); tv.tv_usec = 0; int result = select(fd + 1, &readset, NULL, NULL, &tv); if (result <= 0){ int err = getLastSocketError(); throw SocketError(err, std::string( "disconnect or timeout while receiveing from socket " + hostname(getRemoteAddress()) + ":" + as_string(getRemotePort()))); } } int bytesread = recv(fd, (char*)data, maxlen, 0); if (bytesread>0){ return bytesread; } else if (bytesread == 0) { _myIsConnected = false; // XXX: hack for tcp disconnect //throw SocketDisconnected(PLUS_FILE_LINE); } else { int err = getLastSocketError(); if(err == OS_SOCKET_ERROR(EWOULDBLOCK)) { return 0; } else { throw SocketError(err, "receive() failed"); } } return 0; }
void JConnections::run() { lock(); vector<JConnection*>* freeArray=new vector<JConnection*>(*freeConnectionList); unlock(); jlong currentTime=JSystem::currentTimeMillis(); for (unsigned int i=0; i<freeArray->size(); i++) { JConnection* conn=freeArray->at(i); jlong diff = currentTime - conn->getLastUsed(); if (diff > getConnectionTimeout()) { try { conn->kill(); } catch (JIOException* ex) { //TODO log ex->printStackTrace(&cout); delete ex; } } } delete freeArray; }