嘿,伙计们,我不知道这个问题是否已经被问过了,但是想象一下下面的情况:
我有两个TCP-NSFileHandle(用NSSocketPort打开,用两个NSFileHandle监听),现在我想在它们之间发送一些NSData。
@try {
[fileHandle writeData:data];
}
@catch (NSException * e) {
// Do some alert
}一切都是正确的,直到我想发送一个长度超过32768字节的NSData实例。超过此数量的字节将不会被传输。所以我的问题是:
1)为什么Cocoa不能一次发送超过32768字节?
2)我必须解决这个问题吗?
3)如果是,我会拆分数据,但是你会怎么做呢?另一个套接字如何知道所有数据何时都已发送?
顺便说一句,在发送这个NSData实例之后,两个套接字都应该再次关闭。
发布于 2010-02-09 04:25:41
一次发送的数据量取决于底层框架和库使用的缓冲区大小。虽然它可能是可配置的,但几乎是无关紧要的。TCP的优势在于,它要么保证传输数据(在一个或多个数据包中),要么优雅地失败。
发布于 2010-02-09 04:21:19
您的问题不在于Cocoa,而在于对流套接字的概念上的误解。
TCP是一种流协议。不会保留单独写入的边界。
如果你发送32768个字节,接收端应该准备好让readData (或者不管它叫什么)返回单字节到32768字节的任何地方。如果你得到的少于32768个字节,那么你应该再读一遍来获得剩下的字节。或者可能不是所有其他的,你必须再读一遍。您可以自行设计网络协议,以便接收端知道它何时获得了所有数据;例如,在数据前面加上其长度。
如果writeData发送的数据少于您告诉它发送的数据量,请使用剩余的数据再次调用writeData。也要做好准备,发送比你要求的更少的邮件。
https://stackoverflow.com/questions/2224550
复制相似问题