首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从一个TCP套接字向另一个套接字一次发送超过32768个字节

从一个TCP套接字向另一个套接字一次发送超过32768个字节
EN

Stack Overflow用户
提问于 2010-02-09 04:14:08
回答 2查看 1K关注 0票数 0

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

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

代码语言:javascript
复制
@try {
    [fileHandle writeData:data];
}
@catch (NSException * e) {
    // Do some alert
}

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

1)为什么Cocoa不能一次发送超过32768字节?

2)我必须解决这个问题吗?

3)如果是,我会拆分数据,但是你会怎么做呢?另一个套接字如何知道所有数据何时都已发送?

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-02-09 04:25:41

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

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

Stack Overflow用户

发布于 2010-02-09 04:21:19

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

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

如果你发送32768个字节,接收端应该准备好让readData (或者不管它叫什么)返回单字节到32768字节的任何地方。如果你得到的少于32768个字节,那么你应该再读一遍来获得剩下的字节。或者可能不是所有其他的,你必须再读一遍。您可以自行设计网络协议,以便接收端知道它何时获得了所有数据;例如,在数据前面加上其长度。

如果writeData发送的数据少于您告诉它发送的数据量,请使用剩余的数据再次调用writeData。也要做好准备,发送比你要求的更少的邮件。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2224550

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档