Пример #1
0
    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;
    }
Пример #2
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;
}