如果我在两个进程(或两个线程)之间共享一个套接字,并且在这两个进程中我尝试发送一条阻塞的大消息(大于下划线协议缓冲区),是否可以保证这两个消息将按顺序发送?或者消息可以在内核内部交错吗?
我主要对 TCP over IP 行为感兴趣,但了解它是否根据套接字协议而变化会很有趣。
你问的是如果你write()
同一套接字上的消息 A,然后是 B,A 能保证先于 B 到达吗?对于 SOCK_STREAM(例如 TCP)和 SOCK_SEQPACKET(几乎从未使用过)套接字,答案是绝对的“是”。对于互联网上的 SOCK_DGRAM(即 UDP 数据包),答案是否定的:数据包可以通过网络重新排序。在单个主机上,unix 域数据报套接字将(在我知道的所有系统上)保留顺序,但我不相信任何标准可以保证这一点,并且我确信存在边缘情况。
或者等等:也许您会问两个进程写入的消息是否不会混合?是的:单个系统调用(write/writev/sendto/sendmsg)总是自动将其内容放入文件描述符中。但显然,如果您或您的库将写入拆分为多个调用,您就会失去这种保证。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)