0

嘿伙计们,我不知道这个问题是否已经被问过,但想象一下以下情况:

我有两个 TCP-Sockets(用两个打开NSSocketPortund 监听NSFileHandle),现在我想NSData在它们之间发送一些。

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

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

1) 为什么 Cocoa 不能一次发送超过 32768 字节?
2)我必须解决问题吗?
3)如果是,我会拆分数据,但你会怎么做?另一个套接字如何知道所有数据何时发送?

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

4

2 回答 2

2

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

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

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

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

如果您发送 32768 字节,则接收端应准备好 readData(或任何它所称的)返回从单个字节到 32768 字节的任何位置。如果您得到的字节数少于 32768,那么您应该再次阅读以获取其余部分。或者也许不是所有其他的,你必须再读一遍。由您来设计您的网络协议,以便接收端知道它何时获得所有数据;例如,通过在数据前面加上它的长度。

如果 writeData 发送的数据少于您告诉它发送的数据,请使用其余数据再次调用 writeData。并为此做好准备发送的数量也少于您的要求。

于 2010-02-08T20:21:19.103 回答