Cocoa 一次从一个TCP套接字向另一个TCP套接字发送超过32768字节
嘿,伙计们,我不知道是否有人问过这个问题,但想象一下以下情况: 我有两个TCP套接字(用Cocoa 一次从一个TCP套接字向另一个TCP套接字发送超过32768字节,cocoa,nsdata,tcpsocket,nsfilehandle,nssocketport,Cocoa,Nsdata,Tcpsocket,Nsfilehandle,Nssocketport,嘿,伙计们,我不知道是否有人问过这个问题,但想象一下以下情况: 我有两个TCP套接字(用NSSocketPort打开,用两个NSFileHandle监听),现在我想在它们之间发送一些NSData @try { [fileHandle writeData:data]; } @catch (NSException * e) { // Do some alert } 在我想要发送长度超过32768字节的NSData实例之前,一切都正常。超过此数量的字节将不会被传输。下面是我的问题:
NSSocketPort
打开,用两个NSFileHandle
监听),现在我想在它们之间发送一些NSData
@try {
[fileHandle writeData:data];
}
@catch (NSException * e) {
// Do some alert
}
在我想要发送长度超过32768字节的NSData
实例之前,一切都正常。超过此数量的字节将不会被传输。下面是我的问题:
1) 为什么Cocoa不能一次发送超过32768字节的数据?2) 我必须做变通吗?
3) 如果是,我会分割数据,但你会怎么做?另一个套接字如何知道何时发送所有数据
顺便说一句,在发送这个
NSData
实例之后,两个套接字都应该再次关闭。您的问题不在于Cocoa,而在于对流套接字的概念误解
TCP是一种流协议。不保留单独写入的边界
如果发送32768字节,则接收端应准备好readData(或任何它的调用)返回从单个字节到32768字节的任何位置。如果得到的字节少于32768字节,则应再次读取以获得其余的字节。或者可能不是所有其他的,你还得再读一遍。由您自行设计网络协议,以便接收端知道何时获得所有数据;例如,在数据前面加上长度前缀
如果writeData发送的数据少于您告诉它发送的数据,请使用其余数据再次调用writeData。你的问题不在于可可,而在于对流套接字的概念误解 TCP是一种流协议。不保留单独写入的边界 如果发送32768字节,则接收端应准备好readData(或任何它的调用)返回从单个字节到32768字节的任何位置。如果得到的字节少于32768字节,则应再次读取以获得其余的字节。或者可能不是所有其他的,你还得再读一遍。由您自行设计网络协议,以便接收端知道何时获得所有数据;例如,在数据前面加上长度前缀
如果writeData发送的数据少于您告诉它发送的数据,请使用其余数据再次调用writeData。同时也要做好准备,发送的数据也要比您要求的少。一次发送的数据量取决于底层框架和库使用的缓冲区的大小。虽然它可能是可配置的,但基本上是不相关的。TCP的优点是,它要么保证传输数据(在一个或多个数据包中),要么优雅地失败
一次发送的数据量取决于底层框架和库使用的缓冲区的大小。虽然它可能是可配置的,但基本上是不相关的。TCP的优点是,它要么保证传输数据(在一个或多个数据包中),要么优雅地失败