C# No argument given that corresponds to the required formal parameter 'stream' of 'Receiver(NetworkStream) Error CS7036

Viewed 17

I'm trying to create a C# Socket multi-user server (and eventually client). I want this server to be able to accept multiple clients (who all join and leave at different random moments) and at the same time displays their data (that the server received).

Here is my SocketMultiServer code:

using System.Net.Sockets;
using System.Text;
using System;
using System.Threading;

// Threading
Thread MainThread = Thread.CurrentThread;

Console.Title = "Multi Server";
// Aanmaken van server
TcpListener listener = new TcpListener(System.Net.IPAddress.Any, 6969);
listener.Start(5);                              
Console.WriteLine("Server online...");

// 2 threads
Thread ListenerThread = new Thread(o => Listener(listener));
Thread ReceiverThread = new Thread(o => Receiver());
//Thread ReceiverThread = new Thread(o => Receiver(NetworkStream stream));
ListenerThread.Start();
ReceiverThread.Start();


static void Listener(TcpListener listener)
{
    Console.WriteLine("TEST 2");
    TcpClient client = listener.AcceptTcpClient();
    Console.WriteLine("Client connected...");
    NetworkStream stream = client.GetStream();
}

static void Receiver(NetworkStream stream)
{
    while (true)
    {
        byte[] buffer = new byte[1024];
        stream.Read(buffer, 0, buffer.Length);              
        int recv = 0;
        foreach (byte b in buffer)
        {
            if (b != 0)
            {
                recv++;
            }
        }
        string request = Encoding.UTF8.GetString(buffer, 0, recv);      
        Console.WriteLine(request);
    }
}

I'm having the error: "Error CS7036 There is no argument given that corresponds to the required formal parameter 'stream' of 'Receiver(NetworkStream)' " at l17

Thread ReceiverThread = new Thread(o => Receiver());

My Client code (work in progress)

using System.Net.Sockets;
using System.Text;
using System;

TcpClient client = new TcpClient("127.0.0.1", 6969);
Console.WriteLine("Connected...");

Console.Write("Username > ");
string username = Console.ReadLine();
string username_ = username + (": ");

while (true)
{
    
    Console.WriteLine("Message to send > ");
    string msg = Console.ReadLine();

    if (msg == "exit()")
    {
        break;
    }

    else
    {
        // msg converten 
        int byteCount = Encoding.ASCII.GetByteCount(msg + 1);       
        byte[] sendData = new byte[byteCount];                      
        sendData = Encoding.ASCII.GetBytes(username_ + msg);

        NetworkStream stream = client.GetStream();
        stream.Write(sendData, 0, sendData.Length);
    }   
}

Does someone have a fix? I'm quite new to C# Thanks in advance!

1 Answers

Your primary issue is that you need to pass NetworkStream to Receiver.

However, this is not the way to do a multi-receive server anyway. You are best off using Task and async.

CancellationTokenSource cancellation = new CancellationTokenSource();

static async Task Main()
{
    Console.Title = "Multi Server";
    Console.WriteLine("Press ENTER to stop server...");
    var task = Task.Run(RunServer);
    Console.ReadLine();  // wait for ENTER
    cancellation.Cancel();
    await task;
}

static async Task RunServer()
{
    TcpListener listener;
    try
    {
        listener = new TcpListener(IPAddress.Any, 6969);
        listener.Start(5);
        Console.WriteLine("Server online...");
        while (!cancellation.IsCancellationRequested)
        {
            var client = await listener.AcceptTcpClientAsync();
            Console.WriteLine("Client connected...");
            Task.Run(async () => await Receiver(client), cancellation.Token);
        }
    }
    catch (OperationCancelException)
    { //
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
    finally
    {
        if (listener?.Active == true)
            listener.Stop();
    }
}

static async Task Receiver(TcpClient client)
{
    try
    {
        using client;
        using var stream = client.GetStream();
        var buffer = new byte[1024];
        while (!cancellation.IsCancellationRequested)
        {
            var bytesReceived = await stream.ReadAsync(buffer, 0, buffer.Length);
            if (bytesReceived == 0)
                break;
            string request = Encoding.UTF8.GetString(buffer, 0, bytesReceived);      
            Console.WriteLine(request);
        }
    }
    catch (OperationCancelException)
    { //
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
}

You should have similar async code for the client. Don't forget to dispose everything with using

Related