gpt4 book ai didi

c# - 如果未检测到换行符,则服务器的套接字阻塞,但未检测到客户端的套接字

转载 作者:行者123 更新时间:2023-12-03 12:02:37 29 4
gpt4 key购买 nike

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

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

提前致谢。

最佳答案

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

如果消息恰好是100个字节或100个字节中的任意多个字节,则此操作将失败(在这种情况下,它将在其后附加一条消息)。

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

您将必须包含指示消息长度的 header ,或者具有指示消息结尾的终止符。

关于c# - 如果未检测到换行符,则服务器的套接字阻塞,但未检测到客户端的套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62258609/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com