【问题标题】:TCP Socket Data Send/Recv OperationTCP Socket 数据发送/接收操作
【发布时间】:2013-06-19 11:40:51
【问题描述】:

我正在开发 MMO 游戏服务器。我必须了解 TCP 数据发送/接收操作(不是用法,详细信息)。我想问这个:如果我从.net socket客户端发送一个5kb的数据,服务器socket可以再处理一次这个数据发送操作吗?即5kb的数据是否可以再接收一个5kb = 1. operation:2kb + 2. operation:3kb的操作?

我想再说一遍;如果客户端向服务器发送了一个数据,我们的服务器监听器的 Recv() 方法是否可以再次将这个数据传递给我们的处理程序类(回调操作)?

【问题讨论】:

    标签: c# sockets packet mmo


    【解决方案1】:

    不保证您可以从单个 Send() 中的单个 Receive() 中获取所有数据。

    TCP 算法透明地将您的数据拆分为单个数据包,并且没有直接 API 控制数据包的大小,或者当数据对于单个数据包来说太大时如何拆分数据。请参阅Nagle's algorithm,了解 TCP 如何在后台执行此操作的详细信息。

    如果您想控制确切的数据包内容和发送时间,您应该考虑使用基于数据包的协议 UDP。

    【讨论】:

    • 即使通过TCP,我们也必须创建一个包头来组合它们。我说的对吗?
    • 抱歉 - 我不确定我是否理解。作为 .Net Socket 类的用户,您无需担心 TCP 数据包标头。你得到一个抽象的双向数据管道。
    • 我们必须合并来自 TCP 的数据才能完全接收到我们的数据?
    • 是的 - 在接收端,您需要组合多个 Receive() 结果,并且您需要对数据进行结构化,以便您可以检测何时拥有完整的“消息”。例如。在消息之间使用分隔符。
    • 我将在第一条消息中添加一个数据包标头。该标头包含数据长度和分隔键。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-04
    • 2019-11-27
    • 1970-01-01
    • 2015-06-27
    • 2020-06-23
    • 2011-09-13
    • 2016-04-14
    相关资源
    最近更新 更多