c# - 如果未检测到换行符但客户端的套接字未检测到,则服务器的套接字阻塞
问题描述
在设置 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 时也遇到了这个问题。
提前致谢。
解决方案
仅当您正在读取 100 个字节时,您的while
循环才会继续,并且您似乎打算使用它来检测消息的结尾。
如果消息正好是 100 或任意多个 100 字节,这将失败(在这种情况下,它将附加一条后续消息)。
但更糟糕的是 - 无法保证套接字将返回 100 个字节,即使仍有数据在传输中。Receive
不会等到底层缓冲区达到 100 字节,它会返回当时可用的任何内容。
您将不得不包含一个指示消息长度的标头,或者具有一个指示消息结束的终止符。
推荐阅读
- android - 具有多个操作的多个通知
- python - 如何分组和绘制聚合值
- reactjs - 如何在组件渲染发生之前检查条件?
- ffmpeg - 我可以在生成的 ffmpeg 视频上测试 nvidia 解码器(nvdec/cuvid)的功能吗?
- swift - 使用自定义 segue 时出现 Swift 约束问题
- c++ - Getting several WM_PAINT message with one dispatch
- html - iframe 中的链接正常,但不显示在嵌入页面中
- spring-boot - 未找到 Spring Boot 执行器运行状况检查
- pandas - Pyspark Dataframe udf 依赖于先前的索引值
- mysql - 不在分组日期中的 SQL 连接