void AsyncIOServer::OnRecvEvent(Socket* socket) { Client* client = (Client *)(socket->data); if( client != NULL ) { // switch_log_printf( // SWITCH_CHANNEL_LOG, // SWITCH_LOG_DEBUG, // "AsyncIOServer::OnRecvEvent( client : %p, socket : %p ) \n", // client, // socket // ); // 尝试读取数据 char buf[READ_BUFFER_SIZE]; switch_size_t len = sizeof(buf); switch_status_t status = SWITCH_STATUS_SUCCESS; bool disconnect = false; // 有足够的缓存空间 if( client->CheckBufferEnough() ) { while (true) { status = mTcpServer.Read(socket, (char *)buf, &len); // status = switch_socket_recv(socket->socket, (char *)buf, &len); if( status == SWITCH_STATUS_SUCCESS ) { // 读取数据成功, 缓存到客户端 // switch_log_printf( // SWITCH_CHANNEL_LOG, // SWITCH_LOG_DEBUG, // "AsyncIOServer::OnRecvEvent( client : %p, socket : %p, read ok ) \n", // client, // socket // ); if( client->Write(buf, len) ) { // 放到处理队列 // switch_log_printf( // SWITCH_CHANNEL_LOG, // SWITCH_LOG_DEBUG, // "AsyncIOServer::OnRecvEvent( client : %p, socket : %p, client write buffer ok ) \n", // client, // socket // ); RecvHandle(client); } else { // 没有足够的缓存空间 switch_log_printf( SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "AsyncIOServer::OnRecvEvent( client : %p, socket : %p, write error ) \n", client, socket ); disconnect = true; break; } } else if( SWITCH_STATUS_IS_BREAK(status) /*|| (status == SWITCH_STATUS_INTR)*/ ) { // 没有数据可读超时返回, 不处理 // switch_log_printf( // SWITCH_CHANNEL_LOG, // SWITCH_LOG_DEBUG, // "AsyncIOServer::OnRecvEvent( client : %p, socket : %p, nothing to read ) \n", // client, // socket // ); break; } else { // 读取数据出错, 断开 switch_log_printf( SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "AsyncIOServer::OnRecvEvent( client : %p, socket : %p, read error : %d ) \n", client, socket, status ); disconnect = true; break; } } } else { // 缓存数据过大, 断开 switch_log_printf( SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "AsyncIOServer::OnRecvEvent( client : %p, socket : %p, buffer not enough error ) \n", client, socket ); disconnect = true; } if( disconnect ) { Disconnect(client); } bool bFlag = false; switch_mutex_lock(client->clientMutex); bFlag = ClientCloseIfNeed(client); switch_mutex_unlock(client->clientMutex); if( bFlag ) { // 回调 if( mpAsyncIOServerCallback ) { mpAsyncIOServerCallback->OnDisconnect(client); } // 关闭Socket mTcpServer.Close(client->socket); // 销毁客户端 Client::Destroy(client); } } }