一次从一个 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 个字节到另一个的主要内容,如果未能解决你的问题,请参考以下文章

使用 Qt 通过 TCP 套接字部分发送 xml 消息

无法在 Web 套接字中取消屏蔽多个帧

在一次 send() 调用(tcp 套接字)中保证发送的最小数据大小是多少? [复制]

我一次可以打开多少个 TCP 套接字? [复制]

TCP Socket 不接收数据,写入/发送不超时?

使用 C 中的套接字通过 TCP 发送音频文件