This component provides a helper that allows a server process to handle multiple concurrent IPCs coming through aNamedPlatformChannel
.
In the server process:
staticconstuint64_t kMessagePipeId=0u;classMyInterfaceImpl:public mojom::MyInterface{voidStart(){ server_.set_disconnect_handler( base::BindRepeating(&MyInterfaceImpl::OnDisconnected,this)); server_.StartServer();}voidOnDisconnected(){ LOG(INFO)<<"Receiver disconnected: "<< server_.current_receiver();}// mojom::MyInterface Implementation.voidDoWork() override{// Do something...// If you want to close the connection: server_.Close(server_.current_receiver());}NamedMojoIpcServer<mojom::MyInterface> server_{{.server_name="my_server_name",.message_pipe_id= kMessagePipeId,// Other options when necessary...},this, base::BindRepeating([](mojom::MyInterface* impl, base::ProcessId caller){// Verify the calling process, returning nullptr if unverified.return impl;// impl must outlive NamedMojoIpcServer.},this)};};
Note: In unittestsbase::test:TaskEnvironment
should run until idle afterNamedMojoIpcServer
is shutdown. Otherwise, memory may leak. E.g:
voidMyTestFixture::TearDown(){ ipc_server_->StopServer(); task_environment_.RunUntilIdle();}
In the client:
voidConnectToServer(){mojo::PlatformChannelEndpoint endpoint= named_mojo_ipc_server::ConnectToServer(server_name);auto invitation= mojo::IncomingInvitation::Accept(std::move(endpoint));mojo::Remote<mojom::MyInterface> remote( mojo::PendingRemote<mojom::MyInterface>( invitation.ExtractMessagePipe(kMessagePipeId),0));}
Note that for compatibility with all supported platforms clients should usenamed_mojo_ipc_server::ConnectToServer
instead ofmojo::NamedPlatformChannel::ConnectToServer
. Some platforms require additional connection brokerage steps which are abstracted by the former.
On Windows, the server needs to have the following access rights on the client process:PROCESS_DUP_HANDLE | PROCESS_QUERY_INFORMATION
.
It is possible to bind a different implementation of the interface to each connection by returning differentmojom::MyInterface*
values rather thanthis
. All implementations must outlive the NamedMojoIpcServer.