【问题标题】:TCP Messages are fragmented (split) in Win7 if datasize is more than 1074 bytes如果数据大小超过 1074 字节,则 TCP 消息在 Win7 中被分段(拆分)
【发布时间】:2011-08-23 20:50:58
【问题描述】:

我使用 .NET 框架中的简单 Socket 类通过 TCP 发送和接收数据消息。当我在 Windows XP 上运行我的 tcp 客户端应用程序时,数据消息不会分段(拆分)。但是当我在 Windows 7 上运行相同的 tcp 客户端应用程序时,当数据消息大小超过 1074 字节时,数据消息会被分段(拆分)。

IPEndPoint ipEndPoint = new IPEndPoint("<server ip address>", 601); 
Socket tcpSocket = new Socket(ipEndPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
tcpSocket.Connect(ipEndPoint.Address, ipEndPoint.Port);
tcpSocket .Send(data, data.Length, 0);
tcpSocket.Close();

如果您有任何建议,请告诉我。

【问题讨论】:

  • 如果发送更多数据会发生什么?发送1M之类的东西,看看它是否一直分裂。
  • 这是否发生在同一个网络上?

标签: tcp messages


【解决方案1】:

TCP 连接是一个字节流,它不知道你的消息边界。

来自 TCP 连接的任何单个读取都可以(并且将)返回 1 个字节和提供的缓冲区大小之间。这可能会因网络状况而改变。

在通过特定调用 Send() 写入 TCP 连接的数据量与通过调用 Recv() 从连接读取的数据量之间没有关系,除了写入的所有数据将由一系列 Recv 调用返回。

您应该始终循环接收数据并使用您自己的消息框架来确定您的消息边界。

我在这里写了更多关于此的内容:http://www.codeproject.com/KB/IP/testingsocketservers.aspx 早在 2002 年。

【讨论】:

    猜你喜欢
    • 2019-05-06
    • 1970-01-01
    • 2017-04-28
    • 2020-12-27
    • 2023-04-09
    • 1970-01-01
    • 2014-05-29
    • 2011-12-05
    • 2022-07-22
    相关资源
    最近更新 更多