bool TCPNetwork::RunProcessReceive(const int sessionIdx, const SOCKET fd, fd_set& read_set) { if (FD_ISSET(fd, &read_set)) { return true; } auto ret = ReceiveSocket(sessionIdx); if (ret != NET_ERROR_CODE::NONE) { CloseSession(SOCKET_CLOSE_CASE::SOCKET_RECV_ERROR, fd, sessionIdx); return false; } ret = ReceiveBufferProcess(sessionIdx); if (ret != NET_ERROR_CODE::NONE) { CloseSession(SOCKET_CLOSE_CASE::SOCKET_RECV_BUFFER_PROCESS_ERROR, fd, sessionIdx); return false; } return true; }
void SharedPortEndpoint::DoListenerAccept(ReliSock *return_remote_sock) { #ifdef WIN32 dprintf(D_FULLDEBUG, "SharedPortEndpoint: Entered DoListerAccept Win32 path.\n"); ReliSock *remote_sock = return_remote_sock; if(!remote_sock) { remote_sock = new ReliSock; } EnterCriticalSection(&received_lock); if(!received_sockets.empty()) { WSAPROTOCOL_INFO *received_socket = received_sockets.front(); received_sockets.pop(); LeaveCriticalSection(&received_lock); remote_sock->assign(received_socket); remote_sock->enter_connected_state(); remote_sock->isClient(false); if(!return_remote_sock) daemonCore->HandleReqAsync(remote_sock); HeapFree(GetProcessHeap(), NULL, received_socket); } else { LeaveCriticalSection(&received_lock); dprintf(D_ALWAYS, "SharedPortEndpoint: DoListenerAccept: No connections, error.\n"); } #else ReliSock *accepted_sock = m_listener_sock.accept(); if( !accepted_sock ) { dprintf(D_ALWAYS, "SharedPortEndpoint: failed to accept connection on %s\n", m_full_name.Value()); return; } // Currently, instead of having daemonCore handle the command // for us, we read it here. This means we only support the raw // command protocol. accepted_sock->decode(); int cmd; if( !accepted_sock->get(cmd) ) { dprintf(D_ALWAYS, "SharedPortEndpoint: failed to read command on %s\n", m_full_name.Value()); delete accepted_sock; return; } if( cmd != SHARED_PORT_PASS_SOCK ) { dprintf(D_ALWAYS, "SharedPortEndpoint: received unexpected command %d (%s) on named socket %s\n", cmd, getCommandString(cmd), m_full_name.Value()); delete accepted_sock; return; } if( !accepted_sock->end_of_message() ) { dprintf(D_ALWAYS, "SharedPortEndpoint: failed to read end of message for cmd %s on %s\n", getCommandString(cmd), m_full_name.Value()); delete accepted_sock; return; } dprintf(D_COMMAND|D_FULLDEBUG, "SharedPortEndpoint: received command %d SHARED_PORT_PASS_SOCK on named socket %s\n", cmd, m_full_name.Value()); ReceiveSocket(accepted_sock,return_remote_sock); delete accepted_sock; #endif }