嘿伙计们,我不知道这个问题是否已经被问过,但想象一下以下情况:

我有两个 TCP 套接字(打开方式为 NSSocketPort 和两个人一起听 NSFileHandle)现在我想发送一些 NSData 它们之间。

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

一切都很好,直到我想发送 NSData 长度超过 32768 字节的实例。超过此字节数将不会被传输。这是我的问题:

1) 为什么 Cocoa 不能一次发送超过 32768 字节?
2)我必须采取解决方法吗?
3)如果是的话,我会拆分数据,但是你会怎么做呢?另一个套接字如何知道所有数据何时发送?

顺便说一下,发送完这首单曲后 NSData 例如,两个套接字都应该再次关闭。

有帮助吗?

解决方案

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

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

其他提示

您的问题是不与可可但似乎是流套接字的概念误解。

TCP是一个流协议。单独的写操作的边界不会被保留。

如果您发送32768个字节,接收端应为READDATA准备(或任何它被称为)从的单字节的任何地方返回到32768个字节。如果你得到小于32768个字节,那么你应该再读得到休息。或者,也许不是所有的休息,你必须再次阅读。这是给你让接收端知道什么时候把所有的数据来设计您的网络协议;例如通过与它的长度前缀的数据。

如果写数据发送不到你告诉它发送数据,与数据的其余部分再次调用写数据。和有备无患的的也送不到你要的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top