【问题标题】:Send more than 32768 Bytes at once from one TCP-Socket to an other一次从一个 TCP 套接字发送超过 32768 个字节到另一个
【发布时间】:2010-02-08 20:14:07
【问题描述】:

大家好,我不知道这个问题是否已经被问过,但想象一下以下情况:

我有两个 TCP 套接字(用 NSSocketPort 打开并用两个 NSFileHandle 监听),现在我想在它们之间发送一些 NSData

@try {
    [fileHandle writeData:data];
}
@catch (NSException * e) {
    // Do some alert
}

在我想发送一个长度超过 32768 字节的 NSData 实例之前,一切都是正确的。超过此数量的字节将不会被传输。所以这是我的问题:

1) 为什么 Cocoa 不能一次发送超过 32768 字节?
2)我需要解决方法吗?
3)如果是,我会拆分数据,但你会怎么做?其他套接字如何知道所有数据何时发送?

顺便说一句,在发送这个NSData 实例后,两个套接字都应该再次关闭。

【问题讨论】:

    标签: cocoa nsdata tcpsocket nsfilehandle nssocketport


    【解决方案1】:

    一次发送的数据量取决于底层框架和库使用的缓冲区大小。虽然它可能是可配置的,但它几乎是无关紧要的。 TCP 的优势在于它要么保证传送您的数据(在一个或多个数据包中),要么优雅地失败。

    1. 您不必在发送前拆分数据。底层系统会为您做到这一点。
    2. 在接收端,您可以读取可用数据,然后等待更多字节到达,处理它们,依此类推,直到没有更多数据可用。当发送方完成数据发送后,它会关闭套接字并通知接收方。

    【讨论】:

      【解决方案2】:

      您的问题不在于 Cocoa,而似乎是对流套接字的概念误解。

      TCP 是一种流协议。不会保留单独写入的边界。

      如果您发送 32768 字节,则接收端应准备好让 readData(或其他任何名称)返回从 单个字节 到 32768 字节的任何位置。如果您得到的字节数少于 32768,那么您应该再次阅读以获取其余部分。或者也许不是所有其他的,你必须再读一遍。由您自己设计网络协议,以便接收端知道何时收到所有数据;例如通过在数据前面加上它的长度。

      如果 writeData 发送的数据少于您告诉它发送的数据,请使用其余数据再次调用 writeData。并准备好那个发送的也比你要求的少。

      【讨论】:

      猜你喜欢
      • 2018-06-13
      • 2013-12-05
      • 2015-04-11
      • 2016-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多