回答
我在这里假设你指的是应用程序级别的数据包。
如果使用UDP,你并不需要,因为它是一个消息协议。 TCP是一种字节流协议,因此它不能发送数据包,只是字节。如果您需要通过TCP发送比字节流更复杂的任何内容,则必须在其上添加另一个协议 - HTTP就是这样一种协议。文本相当简单,因为行有终止字符,通常是CR/LF/CRLF。发送非文本消息需要不同的协议。
通常与TCP一起使用的一种方法是连接,流传输协议单元,断开连接。这工作正常,但由于持续打开和关闭TCP连接的巨大延迟而缓慢运行。 HTTP通常以这种方式工作,以便为大量用户提供网页,如果用户在查看页面时被永久连接,则会不必要地耗尽所有服务器套接字。
如果在发送下一条消息之前知道对等接收是绝对必要的,那么等待来自对等方的应用级ACK有时是必要的,但同样由于连接延迟而导致这种情况很慢。 TCP的设计并没有考虑到这种方法。
如果通常可用的IP协议不能直接提供你所需要的,你将不得不求助于实现你自己的。
你发送什么样的'数据包'?
RGDS, 马丁
使用TCP套接字,你刚才看到您可以接收和发送的字节数据流。你无法知道一个数据包在哪里结束,另一个从哪里开始。
这是TCP的功能(和问题)。大多数人只要将数据读入缓冲区,直到看到换行(\ n)。然后处理数据并等待下一行。如果传输二进制数据块,可以首先通知接收器有多少字节的数据即将到来。
如果数据包边界是很重要的,你可以使用UDP但随后的数据包的顺序可能会改变或者某些数据包可能会在途中丢失,不用您知道。
较新的SCTP协议的行为很像TCP(丢失的数据包是重发,分组排序保持不变),但与SCTP插座,使接收端收到一模一样的包,你可以发送数据包。
TCP是一个基于流的协议。也就是说,它为应用程序提供了数据流或数据包或基于消息的接口。如果使用TCP,应用程序必须实现其自己的确定数据包或消息的方法。例如,(a)所有消息都是固定大小,或者(b)每个消息以其后续大小为前缀,或者(c)数据流中有特殊的“结束记录”序列来指示消息边界。在google上搜索大量有关如何在TCP中实现消息边界的信息。
- 1. Flex:将一个数据点从一个位置移动到另一个位置
- 2. 返回一个包含位置的数据库
- 3. 如何插入来自另一个数据库的位置?
- 4. 总结下一个数组元素的起始位置(javascript)
- 5. 确定Java包的位置
- 6. 在树中的某个特定位置包含新数据
- 7. 选择一个数据结构存储在一个句子中的单词和其起始位置
- 8. Google map从开始位置到结束位置的英里数
- 9. 如何更喜欢一个库位置与另一个位于Clang的位置?
- 10. 另一个位置的Javascript
- 11. 如何确定一个数字中的所有设置位是否也设置为另一个数字?
- 12. 定义开始到结束的位置
- 13. 如何将mysql数据库或数据目录移动到另一个位置
- 14. 如何根据另一个阵列位置快速排序一个数组?
- 15. 在Oracle数据库中设置一个数字的特定位
- 16. 传递位置数据到另一个活动的Android
- 17. AS3 - 另一个函数结束时的起始函数
- 18. 确定catch块结束的位置ASM
- 19. 如何在argparse互斥组中包含一个位置参数?
- 20. 如何从一个包传递一个数据流另一
- 21. 我如何将一个位图X位置整数或数字?
- 22. 为3 * num设置的位数,包含一个列表o设置num位的位位置
- 23. 如何指定CATransition中的开始和结束位置?
- 24. setuptools:包数据文件夹位置
- 25. 如何将文本定位到一个精确的位置
- 26. 从我当前位置到另一个位置的距离
- 27. 将数据从一个数据库复制到远程位置的另一个数据库
- 28. 如何绘制从一个GPS位置到另一个位置的线?
- 29. 如何将MKCircleView在一个位置移动到MKMapView中的另一个位置?
- 30. SDL2 - 确定一个SDL_MultiGestureEvent的点位置
你能阐述一下什么样的数据包或插座?例如。使用TCP套接字,你只需要一个数据流。你看不到数据包边界在哪里。使用UDP套接字,您将收到一个包含recv()的数据包。然后,SCTP协议具有有点像TCP流的SEQPACKET,但保留了数据包边界。 – jkj
它的TCP套接字@jkj的情况 –