MayaFlux 0.4.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches

◆ start_accept()

void MayaFlux::Core::TCPBackend::start_accept ( ListenerState listener)
private

Initiate async_accept loop for a listener.

On accept: creates ConnectionState for the new peer, assigns endpoint id via m_allocate_endpoint_id, starts receive chain, fires state callback. Then resubmits async_accept.

Definition at line 394 of file TCPBackend.cpp.

395{
396 listener.pending_socket = asio::ip::tcp::socket(m_context);
397
398 listener.acceptor.async_accept(
399 listener.pending_socket,
400 [this, listener_id = listener.info.id](const asio::error_code& ec) {
401 std::shared_lock lock(m_listeners_mutex);
402 auto it = m_listeners.find(listener_id);
403 if (it == m_listeners.end()) {
404 return;
405 }
406
407 auto& lst = *it->second;
408
409 if (ec) {
410 if (ec == asio::error::operation_aborted) {
411 return;
412 }
414 "TCP accept error on listener {}: {}", listener_id, ec.message());
415 start_accept(lst);
416 return;
417 }
418
419 uint64_t new_id = 0;
421 new_id = m_allocate_endpoint_id();
422 }
423
424 auto peer_ep = lst.pending_socket.remote_endpoint();
425 std::string peer_addr = peer_ep.address().to_string();
426 uint16_t peer_port = peer_ep.port();
427
428 auto conn = std::make_unique<ConnectionState>(m_context);
429 conn->socket = std::move(lst.pending_socket);
430 conn->is_outbound = false;
431 conn->info.id = new_id;
432 conn->info.transport = NetworkTransport::TCP;
433 conn->info.role = EndpointRole::BIDIRECTIONAL;
434 conn->info.state = EndpointState::OPEN;
435 conn->info.remote_address = peer_addr;
436 conn->info.remote_port = peer_port;
437 conn->info.local_port = lst.info.local_port;
438
439 auto* raw = conn.get();
440
441 {
442 std::unique_lock conn_lock(m_connections_mutex);
443 m_connections[new_id] = std::move(conn);
444 }
445
446 if (m_state_callback) {
448 }
449
451
453 "TCP accepted connection {} from {}:{} on listener {}",
454 new_id, peer_addr, peer_port, listener_id);
455
456 start_accept(lst);
457 });
458}
#define MF_INFO(comp, ctx,...)
#define MF_WARN(comp, ctx,...)
void start_receive_chain(ConnectionState &conn)
Start the framed message receive chain on a connection.
std::function< uint64_t()> m_allocate_endpoint_id
Pointer to subsystem's endpoint id allocator.
std::unordered_map< uint64_t, std::unique_ptr< ConnectionState > > m_connections
void start_accept(ListenerState &listener)
Initiate async_accept loop for a listener.
std::shared_mutex m_connections_mutex
asio::io_context & m_context
EndpointStateCallback m_state_callback
@ NetworkBackend
Network transport backend (UDP, TCP, SHM)
@ Core
Core engine, backend, subsystems.

References MayaFlux::Core::TCPBackend::ListenerState::acceptor, MayaFlux::Journal::Core, MayaFlux::Core::EndpointInfo::id, MayaFlux::Core::TCPBackend::ListenerState::info, MF_INFO, MF_WARN, MayaFlux::Journal::NetworkBackend, and MayaFlux::Core::TCPBackend::ListenerState::pending_socket.

Referenced by open_endpoint().

+ Here is the caller graph for this function: