c# - TCP 是否区分发送几条小消息和一条大消息?
问题描述
使用伪 C# 只是因为它是我正在使用的,并假设 C# 只是包装 TCP 协议:
一个
Socket s = ...; //a valid open socket that is receiving
string str = "abcdefghijklmnopqrstuvwxyz";
for(int i=0; i<10;++i)
{
byte[] buf = ASCII.GetBytes(str);
s.Send(buf)
}
乙
Socket s = ...; //a valid open socket that is receiving
string str = "abcdefghijklmnopqrstuvwxyz";
string str2 = "";
for(int i=0; i<10;++i)
{
str2 += str;
}
byte[] buf = ASCII.GetBytes(str2);
s.Send(buf)
这些在 TCP 级别实际上有何不同,具体来说,接收者有什么方法可以知道第一个是 10 个单独的消息,第二个是单个消息?TCP 是否将每个发送调用视为具有某些数据包或结束标识符,还是只是将字节推入流中,我必须定义一种方法来确定基于内容本身发送的内容?
解决方案
它只是将字节推入流中,我必须定义一种方法来确定基于内容本身发送的内容?
是的,它只是将字节推送到流中,然后将其传递到线路上。它们可以以任意数量的数据包大小通过网络。您可以发送一个带有 1 字节有效负载的 TCP 数据包或一个带有接近 9k 字节有效负载的 TCP 数据包(在巨型帧的情况下)。如果 Wire 是“虚拟的”,例如同一主机上的两个客户之间的虚拟交换机,则“数据包”可能是 60K 或更大,具体取决于实现。
作为实施者,您可以自行决定“数据框架”,这可以像换行符(在 http 的情况下)一样简单,也可以是具有不同位和字节的复杂结构,表示不同的消息边界。
推荐阅读
- amazon-ec2 - 使用 AWS_PING 在 EC2 上为 HA 配置 Wildfly 15
- c# - 列出主目录和子目录中的文件
- android - 即使 appAutoUpdatePolicy 设置为 ALWAYS,应用程序也不会更新
- python - 在 Flask 工厂设置中反映不同的数据库
- oracle - 如何避免 Oracle Ref 游标
- javascript - 我想应用过滤器:模糊到任何形状
- c# - 如何为多个测试类创建多个范围报告
- java - 如何以编程方式从 log4j2 中删除 ConsoleLogger?
- python - 如何使用标记将直方图转换为简单图?
- r - 闪亮的 img() 函数,我如何让图像出现?