【问题标题】:How to get length of data received in socket?如何获取套接字中接收到的数据长度?
【发布时间】:2014-12-06 10:48:18
【问题描述】:

上一篇:

我有客户端和服务器。我将一些数据从客户端(win forms)发送到服务器(控制台)。我在客户端使用它发送数据:

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)。如何获取接收到的数据长度并为这些数据分配所需的内存?

【问题讨论】:

    标签: c# sockets system.net.sockets


    【解决方案1】:

    根据MSDN article,Receive 返回的整数是接收到的字节数(这是您分配给 i 的值)。

    如果您将 while 循环更改为这样,那么您将获得您正在寻找的值:

    int bytesReceived = 0;
    while (true)
        {
            i = socketForClient.Receive(cldata);
            bytesReceived += i;
            if (i > 0)
            {
                // same code as before
            }
        }
    

    【讨论】:

    • 没错。那你。我试图在socketForClient 属性中找到消息大小:(
    • 看,我刚刚意识到,我通过客户端发送exit 消息并在服务器上收到exit\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0。为什么?
    • 如果您将代码作为新问题的一部分发布,我会为您寻找而不是试图将其塞入 cmets :)
    • 我会更好地开始新帖子。消息长度实际上是 42 并且您正确回答了问题。服务器发送/客户端在另一个问题中收到错误消息。
    • 呸!看here :)
    猜你喜欢
    • 2022-01-15
    • 2013-03-03
    • 2011-05-10
    • 2011-01-16
    • 2017-11-08
    • 1970-01-01
    • 2018-10-02
    • 1970-01-01
    • 2010-10-30
    相关资源
    最近更新 更多