Python NSOutputStream或twisted reactor合并TCP包数据

Python NSOutputStream或twisted reactor合并TCP包数据,python,objective-c,twisted.internet,nsoutputstream,Python,Objective C,Twisted.internet,Nsoutputstream,我正在为一个与Python Twisted后端接口的iPhone应用程序编写一些网络代码。我最近遇到了一个问题,似乎我的NSOutputStream在发送时将有效负载加倍,或者twisted在接收时将有效负载加倍 我使用的是“苹果推荐”类型的TCP套接字,例如非轮询 过程如下: 客户端 -NSSTREAVENTHASSPACE可用:发送一个包含X字节数据的数据包 -NSSTREAVENTHASSPACE可用:发送另一个Y字节数据包 服务器 -Twisted接收大小为(X+Y)字节的数据包 如果o

我正在为一个与Python Twisted后端接口的iPhone应用程序编写一些网络代码。我最近遇到了一个问题,似乎我的NSOutputStream在发送时将有效负载加倍,或者twisted在接收时将有效负载加倍

我使用的是“苹果推荐”类型的TCP套接字,例如非轮询

过程如下:
客户端
-NSSTREAVENTHASSPACE可用:发送一个包含X字节数据的数据包
-NSSTREAVENTHASSPACE可用:发送另一个Y字节数据包
服务器
-Twisted接收大小为(X+Y)字节的数据包

如果outputStream的状态为“NSStreamStatusWriting”,我将确保我显式地发送数据。还应确保在未抛出NSStreamEventHasSpaceAvailable的情况下,不允许从客户端发送数据

关于什么可能导致有效载荷的双重增加/合并,有什么想法吗?Twisted代码相当直接,使用我的协议中接收的标准数据:

def dataRecieved(self, data): # do logic in order to decide how to handle data # ... # print of len(data) here reveals merged packet size 接收到的def数据(自身、数据): #执行逻辑以决定如何处理数据 # ... #此处的len(数据)打印显示合并的数据包大小 iOS代码也是相当标准的:

if (eventCode == NSStreamEventHasSpaceAvailable) { [outputStream write:[packet getData] maxLength:[packet getPacketSize]]; } // [packet getData] simply returns a standard UInt8 array. // [packet getPacketSize] returns the size of that array. if(eventCode==nsstreamventhassspaceavailable) { [outputStream写入:[数据包getData]最大长度:[数据包getPacketSize]]; } //[packet getData]只返回一个标准的UInt8数组。 //[packet getPacketSize]返回该数组的大小。 当上述iOS代码连续调用两次(例如,一个接一个地发送两个数据包)时,twisted代码报告合并的数据大小

提前感谢您的任何建议或建议

我同意,我不必这么做 期望缓冲区边界匹配 起来吧,但我想这是个时间问题 可预测的行为

基于TCP的通信中没有可预测的行为;在您和远程主机之间可能有任意数量的路由器、NAT边界、goofy代理或任何指示出现意外行为的东西

见鬼,甚至有可能

然而,在现实世界中,这种行为通常是可以预测的。但不总是,永远不会100%的时间,总是有一些潜在的客户在某个地方与堵塞的管道

使用TCP,您至少可以保证,除非出现错误,一般情况下,数据包将按照发送顺序接收。再次假设,之间的所有点要么正确实现,要么没有恶意(后一位意味着您必须假设有时数据会被破坏)

即使是这种保证也没有多大意义;您可能会收到10个数据包中的前8个。。。或者,您可能会收到所有的内绑定数据,但当您进行响应时,却发现外绑定连接已断开

底线;双方的缓冲算法都必须假设缓冲区可能以随机突发的方式填充,而这些突发的随机突发完全不匹配卡在另一端的数据的大小。虽然不是严格要求,但您的应用程序最好通过防御随机连接故障来实现;针对截断的缓冲区、随机断开的连接和数据损坏


早期字节长度字段和校验和是您的朋友。你是谁!hjfdahjdas8y$(&($@#&^@#)^&!&&[连接丢失]

也许我误解了这个问题,但tcp是一个流,你永远不应该期望一端的缓冲区边界与另一端匹配。我同意——我不一定期望缓冲区边界匹配,但我认为这是一个可预测的行为问题。在某些情况下,当我将数据背靠背发送时,它们最终会被接收为当在其他情况下合并有效负载时,来自反应的两个单独的“dataReceived”调用。只是想弄清楚为什么有效负载有时合并,而不是总是合并。感谢提醒=)。这些事我记忆犹新。我想我希望TCP在这种情况下像UDP一样工作。无论我以多快的速度背对背发送数据包,我都无法100%确定是否可以依靠不同的数据包到达。我想我已经想出了一个解决方案来收集我想要的结果——用额外的顺序、大小等信息打包数据,以便在数据包到达时解析这些数据包。