从一个TCP-Socket一次发送超过32768字节到另一个

时间:2010-02-08 20:14:08

标签: cocoa nsdata tcpsocket nsfilehandle nssocketport

嘿伙计们,我不知道这个问题是否已被提出但想象下面的情况:

我有两个TCP套接字(用NSSocketPort打开,用两个NSFileHandle监听),现在我想在它们之间发送一些NSData

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

在我想发送长度超过32768字节的NSData实例之前,一切都是正确的。超过这个字节数将不会被转移。所以这是我的问题:

1)为什么Cocoa不能一次发送超过32768字节? 2)我是否需要制定解决方法? 3)如果是,我会分割数据,但你会怎么做?另一个插槽如何知道何时发送所有数据?

顺便说一句,在发送这个单NSData个实例后,两个套接字应该再次关闭。

2 个答案:

答案 0 :(得分:2)

您的问题不在于Cocoa,但似乎是对流套接字的概念性误解。

TCP是一种流协议。不会保留单独写入的边界。

如果发送32768字节,接收端应该为readData(或其所谓的任何内容)做好准备,以便从单字节返回到32768字节。如果你得到少于32768字节,那么你应该再读一遍以得到其余的。或许不是所有其他的,你必须再读一遍。您可以自行设计网络协议,以便接收端知道何时获得所有数据;例如,通过为数据添加长度前缀。

如果writeData发送的数据少于您要发送的数据,请再次使用其余数据调用writeData。并准备 也发送少于你要求的。

答案 1 :(得分:2)

一次发送的数据量取决于底层框架和库使用的缓冲区大小。虽然它可以配置,但它几乎无关紧要。 TCP的优势在于它可以保证提供数据(在一个或多个数据包中)或优雅地失败。

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