服务器的套接字阻塞(如果未检测到换行符但客户端的套接字未检测到)



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

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

这是我在 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 是一个包含 Client 对象的列表,其中包含每个客户端信息(包括其套接字(。

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

提前谢谢。

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

如果消息正好是 100 个字节或任何 100 个字节(在这种情况下,它将向其附加后续消息(,则此操作将失败。

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

您必须包含一个指示消息长度的标头,或者具有指示消息结尾的终止符字符。

最新更新