Как получить длину данных, полученных в сокете?

Pre:

У меня есть клиент и сервер. Я отправляю некоторые данные от клиента (формы win) на сервер (консоль). Я отправляю данные, используя это на клиенте:

try {
    sock = client.Client;

    data = "Welcome message from client with proccess id " + currentProcessAsText;
    sock.Send(Encoding.ASCII.GetBytes(data));
}
catch
{
    // say there that 
}

На сервер я получаю данные по этому:

private void ServStart()
{
    Socket ClientSock; // сокет для обмена данными.
    string data;
    byte[] cldata = new byte[1024]; // буфер данных
    Listener = new TcpListener(LocalPort);
    Listener.Start(); // начали слушать
    Console.WriteLine("Waiting connections [" + Convert.ToString(LocalPort) + "]...");

    for (int i = 0; i < 1000; i++)
    {
        Thread newThread = new Thread(new ThreadStart(Listeners));
        newThread.Start();
    }
}

private void Listeners()
{
    Socket socketForClient = Listener.AcceptSocket();
    string data;
    byte[] cldata = new byte[1024]; // буфер данных
    int i = 0;

    if (socketForClient.Connected)
    {
        string remoteHost = socketForClient.RemoteEndPoint.ToString();
        Console.WriteLine("Client:" + remoteHost + " now connected to server.");
        while (true)
        {
            i = socketForClient.Receive(cldata);
            if (i > 0)
            {
                data = "";
                data = Encoding.ASCII.GetString(cldata).Trim();
                if (data.Contains("exit"))
                {
                    socketForClient.Close();
                    Console.WriteLine("Client:" + remoteHost + " is disconnected from the server.");
                    break;
                }
                else
                {
                    Console.WriteLine("\n----------------------\n" + data + "\n----------------------\n");
                }
            }
        }
    }   
} 

Сервер запускает потоки и запускает прослушивающий сокет на каждом.

Проблема:

Когда клиент подключается или отправляет сообщение, сервер выводит полученное сообщение + ~ 900 пробелов (потому что буфер 1024). Как я могу получить полученную длину данных и выделить столько памяти, сколько необходимо для этих данных?

1 ответ

Решение

Согласно статье MSDN, целое число, возвращаемое функцией Receive, представляет собой количество полученных байтов (это значение, которое вы присвоили i).

Если вы измените цикл while таким образом, вы получите значение, которое вы ищете:

int bytesReceived = 0;
while (true)
    {
        i = socketForClient.Receive(cldata);
        bytesReceived += i;
        if (i > 0)
        {
            // same code as before
        }
    }
Другие вопросы по тегам