我正在学习套接字并在中找到了“数据或记录边界”一词SOCK_SEQPACKET通讯协议?任何人都可以用简单的话解释什么是数据边界以及如何SOCK_SEQPACKET不同于SOCK_STREAM & SOCK_DGRAM ?
这个答案https://stackoverflow.com/a/9563694/1076479对消息边界有很好的简洁解释(“记录边界”的不同名称)。
将该答案扩展到SOCK_SEQPACKET
:
SOCK_STREAM
提供可靠、有序的通信streams两个对等点之间的数据。它不维护消息(记录)边界,这意味着应用程序必须在提供的流之上管理自己的边界。
SOCK_DGRAM
提供不可靠的数据报的传输。数据报是独立的胶囊,并且它们的边界得到维护。这意味着如果您在对等点 A 上发送 20 字节缓冲区,对等点 B 将收到一条 20 字节消息。但是,它们可能会被丢弃或乱序接收,并且由应用程序来解决并处理它。
SOCK_SEQPACKET
是一项尚未广泛使用的新技术,但试图将上述两者的优点结合起来。也就是说,它提供可靠、有序的通信,并将整个“数据报”作为一个单元进行传输(并因此保持消息边界)。
通过展示忽略消息边界时会发生什么来演示消息边界的概念是最简单的。初学者经常在 SO 上发布这样的客户端代码(为了方便使用 python):
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('192.168.4.122', 9000))
s.send(b'FOO') # Send string 1
s.send(b'BAR') # Send string 2
reply = s.recv(128) # Receive reply
和服务器代码类似:
lsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
lsock.bind(('', 9000))
lsock.listen(5)
csock, caddr = lsock.accept()
string1 = csock.recv(128) # Receive first string
string2 = csock.recv(128) # Receive second string <== XXXXXXX
csock.send(b'Got your messages') # Send reply
他们不明白为什么服务器挂在第二个recv
调用,而客户端则自行挂起recv
称呼。发生这种情况是因为客户端发送的两个字符串(可能)捆绑在一起并在第一个中作为单个单元接收recv
在服务器端。也就是说,两个逻辑消息之间的消息边界是not保存下来,等等string1
通常会包含一起运行的两个块:'FOOBAR'
(通常,代码中还有其他与时间相关的方面,会影响何时/是否实际发生。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)