The concept is that one is the Server (inherits from InterprocessConnectionServer) and the other / others are the clients, which inherit from InterprocessConnection.
You also need to create your own subclass of InterprocessConnection on the server side that represents a client-connection for the createConnectionObject() function, so you specify what to do on messageReceived() etc.
You can’t just use the base InterprocessConnection class!
so TLDR:
server(IPCS) listens for connections, a client(IPC) connects, the server creates a connection/client-object (IPC) that communicates with the client on the other side.
The following is a shortened header only version to explain the concept, I think you can fill in the rest 
In the Server app:
Client.h (This is NOT in the client app, but a representation of a connected client for the server)
class Client : public juce::InterprocessConnection
{
public:
Client();
~Client();
void connectionMade() override;
void connectionLost() override;
void messageReceived(const juce::MemoryBlock& message) override;
// Implement your desired behaviour for those functions
// e.g. what to do when a client sends a message to the server
[...]
}
Server.h
#include "Client.h"
class Server : public juce::InterprocessConnectionServer
{
public:
Server() { beginWaitingForSocket(yourPort); };
~Server() { stop(); };
InterprocessConnection * createConnectionObject () { return clients.add(new Client()); };
private:
juce::OwnedArray<Client> clients;
}
Then on the other PC / the client application you might have:
class ServerConnection : public juce::InterprocessConnection
{
public:
ServerConnection() { connectToSocket(serverIP, yourPort, 3000); }
void connectionMade() override;
void connectionLost() override;
void messageReceived (const juce::MemoryBlock &message) override;
// implement your desired behaviour
// e.g. what to do when the server sends a message to this client
[...]
}
Hope this helps you to understand the base concept and the parts involved!
That said you wrote you wanted more speed, but TCP with its handshake might be slower than OSC in the end, but thats depends also on the amount and frequency of data you are sending.