一次从一个 TCP 套接字发送超过 32768 个字节到另一个
Posted
技术标签:
【中文标题】一次从一个 TCP 套接字发送超过 32768 个字节到另一个【英文标题】:Send more than 32768 Bytes at once from one TCP-Socket to an other 【发布时间】: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
实例后,两个套接字都应该再次关闭。
【问题讨论】:
【参考方案1】:一次发送的数据量取决于底层框架和库使用的缓冲区大小。虽然它可能是可配置的,但它几乎是无关紧要的。 TCP 的优势在于它要么保证传送您的数据(在一个或多个数据包中),要么优雅地失败。
-
您不必在发送前拆分数据。底层系统会为您做到这一点。
在接收端,您可以读取可用数据,然后等待更多字节到达,处理它们,依此类推,直到没有更多数据可用。当发送方完成数据发送后,它会关闭套接字并通知接收方。
【讨论】:
【参考方案2】:您的问题不在于 Cocoa,而似乎是对流套接字的概念误解。
TCP 是一种流协议。不会保留单独写入的边界。
如果您发送 32768 字节,则接收端应准备好让 readData(或其他任何名称)返回从 单个字节 到 32768 字节的任何位置。如果您得到的字节数少于 32768,那么您应该再次阅读以获取其余部分。或者也许不是所有其他的,你必须再读一遍。由您自己设计网络协议,以便接收端知道何时收到所有数据;例如通过在数据前面加上它的长度。
如果 writeData 发送的数据少于您告诉它发送的数据,请使用其余数据再次调用 writeData。并准备好那个发送的也比你要求的少。
【讨论】:
另外,跛行数 20:tangentsoft.net/wskfaq/articles/lame-list.html#item20以上是关于一次从一个 TCP 套接字发送超过 32768 个字节到另一个的主要内容,如果未能解决你的问题,请参考以下文章