I'm trying to write a chat client/server in c# locally to get familiar with Sockets.
First I start the server with (very simplified) following code:
Server.cs
    private readonly MessageManager _messageManager;
    private readonly ChatServer _chatServer;
    public ChatServerSkeleton()
    {
        _messageManager = new MessageManager();
        _chatServer = new ChatServer();
        Console.WriteLine("Server is running on: " + _messageManager.MyAddress);
    }
Then I start the Client with +- same way, except I store the serveraddress in the client (I copied the server address into a prompt).
Client.cs
    private readonly MessageManager _messageManager;
    public ChatClient ChatClient { get; }
    public ChatClientSkeleton(IPEndPoint serverAddress, string name)
    {
        _messageManager = new MessageManager();
        ChatClient = new ChatClient(new ChatServerStub(serverAddress, _messageManager), name);
        Console.WriteLine($"IPAddress of {name} is: {_messageManager.MyAddress}");
        Console.WriteLine($"IPAddress of Server is: { serverAddress}");
    }
MessageManager.cs
    private readonly TcpListener _serverSocket;
    public IPEndPoint MyAddress { get; }
    public MessageManager()
    {
        try
        {
            //Create server socket on random port
            _serverSocket = new TcpListener(IPAddress.Any, FindFreeTcpPort());
            //Get host ip address
            IPAddress[] localIps = Dns.GetHostAddresses(Dns.GetHostName());
            IPAddress localhost = localIps.First(ip => ip.AddressFamily == AddressFamily.InterNetwork);
            //Get port of serversocket
            IPEndPoint ipEndPoint = _serverSocket.LocalEndpoint as IPEndPoint;
            int port = ipEndPoint.Port;
            //Create address
            MyAddress = new IPEndPoint(localhost, port);
        }
        catch (Exception ex)
        {
            Console.Error.WriteLine("Something went wrong with the serversocket:");
            Console.Error.WriteLine(ex);
        } 
    }
FindFreeTcp port comes from here: https://stackoverflow.com/a/150974/5985593
Everything up till now seems to work. Let's say for example the server has now 192.168.0.219:51080 and the client 192.168.0.219:51085.
The problem occurs when I'm trying to send a message using this code in MessageManager.cs
    public void Send(MethodCallMessage message, IPEndPoint address)
    {
        try
        {
            _serverSocket.Start();
            TcpClient destination = new TcpClient(address.Address.ToString(), address.Port);
            NetworkStream output = destination.GetStream();
            MessageReaderWriter.Write(message, output);
            destination.Close();
        }
        catch (Exception ex)
        {
            Console.Error.WriteLine("Failed to write a message:");
            Console.Error.WriteLine(ex);
        }
        finally
        {
            _serverSocket.Stop();
        }
    }
More specific on the _server.Start(); line.
Anyone knows what I'm doing wrong?
Thanks in advance!
EDIT: it runs fine 1 time, when registering the client on the server. But after that if I want to send a message I get the SocketException where target machine actively refused.
I do use AcceptTcpClient() here:
MessageManager.cs
    public MethodCallMessage WReceive()
    {
        MethodCallMessage result = null;
        try
        {
            //_serverSocket.Start();
            TcpClient client = _serverSocket.AcceptTcpClient();
            NetworkStream input = new NetworkStream(client.Client, true);
            result = MessageReaderWriter.Read(input);
            client.Close();
        }
        catch (Exception ex)
        {
            Console.Error.WriteLine("Failed to receive a message:");
            Console.Error.WriteLine(ex);
        }
        finally
        {
            //_serverSocket.Stop();
        }
        return result;
    }
This method is used in the ServerSkeleton & ClientSkeleton as follows:
    public void Run()
    {
        while (true)
        {
            MethodCallMessage request = _messageManager.WReceive();
            HandleRequest(request);
        }
    }
So the flow is basically as follows:
- I start the server (instantiate new messagemanager, 3rd snippet and run serverskeleton (last snippet)
 - Server prints IP in console, i copy the ip & start the client
 - Instantiate client & set server ip to what I copy pasted
 - Start client skeleton (last snippet)