Socket发送并发保证

lve*_*lla 3 sockets linux

如果我在两个进程(或两个线程)之间共享一个套接字,并且在这两个进程中我尝试发送阻塞的大消息(大于下划线协议缓冲区),是否保证两个消息将按顺序发送?或者消息可以在内核中交错?

我主要对TCP over IP行为感兴趣,但知道它是否根据socket的协议而变化会很有趣.

And*_*oss 5

你问的是,如果你write()在同一个套接字上发信息A,那么B是否保证在B之前到达?对于SOCK_STREAM(例如TCP)和SOCK_SEQPACKET(几乎从未使用过)套接字,答案是不合格的是.对于Internet上的SOCK_DGRAM(即UDP数据包),答案是否定的:数据包可以由网络重新排序.在单个主机上,unix域数据报套接字(在我知道的所有系统上)都会保留排序,但我不相信任何标准都能保证这一点,我确信存在边缘情况.

或者等一下:也许你问的是这两个进程写的消息是不会混合的?是:单个系统调用(write/writev/sendto/sendmsg)始终以原子方式将其内容放入文件描述符中.但显然,如果你或你的图书馆将这些写入分成多个电话,你将失去这种保证.