static int recv_to_fifo(int fd) { int len; if( (fd<0) || (fd>=FD_SETSIZE) || (NULL==session[fd]) ) return -1; if(session[fd]->eof) return -1; #ifdef __WIN32 len=recv(fd,(char *)session[fd]->rdata+session[fd]->rdata_size, RFIFOSPACE(fd), 0); if (len == SOCKET_ERROR) { if (WSAGetLastError() == WSAECONNABORTED) { ShowWarning("recv_to_fifo: software de conexao cancelado na sessao #%d\n", fd); FD_CLR(fd, &readfds); //Remove the socket so the select() won't hang on it. // exit(1); //Windows can't really recover from this one. [Skotlex] } if (WSAGetLastError() != WSAEWOULDBLOCK) { // ShowDebug("recv_to_fifo: error %d, ending connection #%d\n", WSAGetLastError(), fd); set_eof(fd); } return 0; } #else len=read(fd,session[fd]->rdata+session[fd]->rdata_size, RFIFOSPACE(fd)); if (len == -1) { if (errno == ECONNABORTED) { ShowFatalError("recv_to_fifo: Quebra de conexao (software de conexao cancelado na sessao #%d)\n", fd); // exit(1); //Temporal debug, maybe this can be fixed. } if (errno != EAGAIN) { //Connection error. // perror("closing session: recv_to_fifo"); set_eof(fd); } return 0; } #endif if (len <= 0) { //Normal connection end. set_eof(fd); return 0; } session[fd]->rdata_size+=len; session[fd]->rdata_tick = last_tick; return 0; }
int recv_to_fifo(int fd) { int len; if( !session_isActive(fd) ) return -1; len = sRecv(fd, (char *) session[fd]->rdata + session[fd]->rdata_size, (int)RFIFOSPACE(fd), 0); if( len == SOCKET_ERROR ) {//An exception has occured if( sErrno != S_EWOULDBLOCK ) { //ShowDebug("recv_to_fifo: code %d, closing connection #%d\n", sErrno, fd); set_eof(fd); } return 0; } if( len == 0 ) {//Normal connection end. set_eof(fd); return 0; } session[fd]->rdata_size += len; session[fd]->rdata_tick = last_tick; return 0; }
int recv_to_fifo(int fd) { int len; if( !session_isActive(fd) ) return -1; len = sRecv(fd, (char *) session[fd]->rdata + session[fd]->rdata_size, (int)RFIFOSPACE(fd), 0); if( len == SOCKET_ERROR ) { //An exception has occured if( sErrno != S_EWOULDBLOCK ) { //ShowDebug("recv_to_fifo: %s, closing connection #%d\n", error_msg(), fd); set_eof(fd); } return 0; } if( len == 0 ) { //Normal connection end. set_eof(fd); return 0; } session[fd]->rdata_size += len; session[fd]->rdata_tick = last_tick; #ifdef SHOW_SERVER_STATS socket_data_i += len; socket_data_qi += len; if (!session[fd]->flag.server) { socket_data_ci += len; } #endif return 0; }
void tcp_connection::start_read() { socket_.async_read_some(boost::asio::buffer((char*)(rdata + rdata_size), RFIFOSPACE(this)), boost::bind(&tcp_connection::handle_read, shared_from_this(), boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred)); }
/// Read from socket to the queue static void recv_to_fifo(int fd) { if (session[fd]->eof) return; ssize_t len = read(fd, &session[fd]->rdata[session[fd]->rdata_size], RFIFOSPACE(fd)); if (len > 0) { session[fd]->rdata_size += len; session[fd]->connected = 1; } else { session[fd]->eof = 1; } }