首页 > 解决方案 > 如果未检测到换行符但客户端的套接字未检测到,则服务器的套接字阻塞

问题描述

在设置 TCP 服务器-客户端连接时,我意识到如果客户端不发送“\n”,服务器接收功能会挂起,但如果服务器不发送,客户端不会阻塞。我试图寻找解释但没有找到正确的答案,所以我来这里寻求您的帮助。

我正在使用相同的功能为服务器和客户端交换数据,但我不知道为什么它适用于一个而不适用于另一个......

这是我在 C# 中的函数:

public bool sendToClient(int i, string msg)
{
    try
    {                    
        (clientSockets.ElementAt(i)).mSocket.Send(Encoding.ASCII.GetBytes(msg));
    }
    catch(Exception e)
    {
        Console.WriteLine(e.Data.ToString());
        return false;
    }
    return true;
}

private string getMessageFromConnection(Socket s)
{
    byte[] buff;
    string msg = "";
    int k;
    do
    {
        buff = new byte[100];

        k = s.Receive(buff, 100, SocketFlags.None);

        msg += Encoding.ASCII.GetString(buff, 0, k);

    } while (k >= 100);

    return msg;
}

套接字是简单的 SOCK_STREAM 套接字,clientSockets 是一个包含客户端对象的列表,其中包含每个客户端信息,包括它们的套接字。

我知道一种解决方案是检测特定字符以结束消息,但我想知道其背后的原因,因为我在使用 C 时也遇到了这个问题。

提前致谢。

标签: c#sockets

解决方案


仅当您正在读取 100 个字节时,您的while循环才会继续,并且您似乎打算使用它来检测消息的结尾。

如果消息正好是 100 或任意多个 100 字节,这将失败(在这种情况下,它将附加一条后续消息)。

但更糟糕的是 - 无法保证套接字将返回 100 个字节,即使仍有数据在传输中。Receive不会等到底层缓冲区达到 100 字节,它会返回当时可用的任何内容。

您将不得不包含一个指示消息长度的标头,或者具有一个指示消息结束的终止符。


推荐阅读