一次从一个 TCP 套接字向另一个 TCP 套接字发送超过 32768 字节
-
19-09-2019 - |
题
嘿伙计们,我不知道这个问题是否已经被问过,但想象一下以下情况:
我有两个 TCP 套接字(打开方式为 NSSocketPort
和两个人一起听 NSFileHandle
)现在我想发送一些 NSData
它们之间。
@try {
[fileHandle writeData:data];
}
@catch (NSException * e) {
// Do some alert
}
一切都很好,直到我想发送 NSData
长度超过 32768 字节的实例。超过此字节数将不会被传输。这是我的问题:
1) 为什么 Cocoa 不能一次发送超过 32768 字节?
2)我必须采取解决方法吗?
3)如果是的话,我会拆分数据,但是你会怎么做呢?另一个套接字如何知道所有数据何时发送?
顺便说一下,发送完这首单曲后 NSData
例如,两个套接字都应该再次关闭。
解决方案
一次发送的数据量取决于底层框架和库使用的缓冲区的大小。虽然它可能是可配置的,但它基本上是无关紧要的。TCP 的优点是它要么保证传送数据(在一个或多个数据包中),要么优雅地失败。
- 您不必在发送前拆分数据。底层系统会为你做这件事。
- 在接收端,您可以读取可用数据,然后等待更多字节到达,处理它们,依此类推,直到没有更多数据可用。当发送方完成数据发送后,它将关闭套接字,接收方将收到通知。
其他提示
您的问题是不与可可但似乎是流套接字的概念误解。
TCP是一个流协议。单独的写操作的边界不会被保留。
如果您发送32768个字节,接收端应为READDATA准备(或任何它被称为)从的单字节的任何地方返回到32768个字节。如果你得到小于32768个字节,那么你应该再读得到休息。或者,也许不是所有的休息,你必须再次阅读。这是给你让接收端知道什么时候把所有的数据来设计您的网络协议;例如通过与它的长度前缀的数据。
如果写数据发送不到你告诉它发送数据,与数据的其余部分再次调用写数据。和有备无患的是的也送不到你要的。
不隶属于 StackOverflow