Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cocoa 一次从一个TCP套接字向另一个TCP套接字发送超过32768字节_Cocoa_Nsdata_Tcpsocket_Nsfilehandle_Nssocketport - Fatal编程技术网

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

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实例之前,一切都正常。超过此数量的字节将不会被传输。下面是我的问题:

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

我有两个TCP套接字(用
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的优点是,它要么保证传输数据(在一个或多个数据包中),要么优雅地失败

  • 发送数据之前不必拆分数据。底层系统将为您做到这一点
  • 在接收端,您可以读取可用数据,然后等待更多字节到达,处理它们,依此类推,直到不再有可用数据。当发送方完成数据发送后,它将关闭套接字并通知接收方
  • 同样,跛行编号20:同样,跛行编号20: