void SocketConnection::readFromSocket() throw( SocketRecvFailed ) { int size = recv( m_socket, m_buffer, sizeof(m_buffer), 0 ); if( size <= 0 ) throw SocketRecvFailed( size ); m_parser.addToStream( m_buffer, size ); }
bool ThreadedSocketConnection::read() { struct timeval timeout = { 1, 0 }; fd_set readset = m_fds; try { // Wait for input (1 second timeout) int result = select( 1 + m_socket, &readset, 0, 0, &timeout ); if( result > 0 ) // Something to read { // We can read without blocking ssize_t size = socket_recv( m_socket, m_buffer, sizeof(m_buffer) ); if ( size <= 0 ) { throw SocketRecvFailed( size ); } m_parser.addToStream( m_buffer, size ); } else if( result == 0 && m_pSession ) // Timeout { m_pSession->next(); } else if( result < 0 ) // Error { throw SocketRecvFailed( result ); } processStream(); return true; } catch ( SocketRecvFailed& e ) { if( m_disconnect ) return false; if( m_pSession ) { m_pSession->getLog()->onEvent( e.what() ); m_pSession->disconnect(); } else { disconnect(); } return false; } }
bool ThreadedSocketConnection::read() { int timeout = 1000; // 1000ms = 1 second struct pollfd pfd = { m_socket, POLLIN | POLLPRI, 0 }; try { // Wait for input (1 second timeout) int result = poll( &pfd, 1, timeout ); if( result > 0 ) // Something to read { // We can read without blocking int size = recv( m_socket, m_buffer, sizeof(m_buffer), 0 ); if ( size <= 0 ) { throw SocketRecvFailed( size ); } m_parser.addToStream( m_buffer, size ); } else if( result == 0 && m_pSession ) // Timeout { m_pSession->next(); } else if( result < 0 ) // Error { throw SocketRecvFailed( result ); } processStream(); return true; } catch ( SocketRecvFailed& e ) { if( m_disconnect ) return false; if( m_pSession ) { m_pSession->getLog()->onEvent( e.what() ); m_pSession->disconnect(); } else { disconnect(); } return false; } }