嘿伙计们,我不知道这个问题是否已被提出但想象下面的情况:
我有两个TCP套接字(用NSSocketPort
打开,用两个NSFileHandle
监听),现在我想在它们之间发送一些NSData
。
@try {
[fileHandle writeData:data];
}
@catch (NSException * e) {
// Do some alert
}
在我想发送长度超过32768字节的NSData
实例之前,一切都是正确的。超过这个字节数将不会被转移。所以这是我的问题:
1)为什么Cocoa不能一次发送超过32768字节? 2)我是否需要制定解决方法? 3)如果是,我会分割数据,但你会怎么做?另一个插槽如何知道何时发送所有数据?
顺便说一句,在发送这个单NSData
个实例后,两个套接字应该再次关闭。
答案 0 :(得分:2)
您的问题不在于Cocoa,但似乎是对流套接字的概念性误解。
TCP是一种流协议。不会保留单独写入的边界。
如果发送32768字节,接收端应该为readData(或其所谓的任何内容)做好准备,以便从单字节返回到32768字节。如果你得到少于32768字节,那么你应该再读一遍以得到其余的。或许不是所有其他的,你必须再读一遍。您可以自行设计网络协议,以便接收端知道何时获得所有数据;例如,通过为数据添加长度前缀。
如果writeData发送的数据少于您要发送的数据,请再次使用其余数据调用writeData。并准备 也发送少于你要求的。
答案 1 :(得分:2)
一次发送的数据量取决于底层框架和库使用的缓冲区大小。虽然它可以配置,但它几乎无关紧要。 TCP的优势在于它可以保证提供数据(在一个或多个数据包中)或优雅地失败。