我搜索过但找不到以下内容:
Process1通过TCP套接字传输数据。进行传输的代码是(伪代码)
//Section 1
write(sock,data,len);//any language.Just write data
//Section 2
写入后的进程1可以在第2节中继续,但这并不意味着数据已经传输。 TCP可以缓冲数据以供以后传输
现在Process2与Process1同时运行。两个进程都尝试同时发送数据 。即两者都将具有上述代码。答案 0 :(得分:4)
嗯,你在谈论由两个进程共享的单个套接字(如父进程和子进程)吗?在这种情况下,数据将按输出系统调用(write(2)
s)的顺序进行缓冲。
如果您更有可能在两个进程中讨论两个不相关的TCP套接字,那么就不能保证数据会在网络中出现任何顺序。原因是套接字可能连接到消耗不同速度数据的远程点。 TCP flow control然后确保快速发送方不会压倒慢速接收方。
答案 1 :(得分:2)
答案1:订单未指定,至少在我见过的支持套接字的操作系统上。过程1& 2应设计成合作,例如通过在套接字上共享一个锁/互斥锁。
答案2:如果你的意思是固定时间延迟,那就不行了。相反,让进程1向进程2发出一个前进信号,指示进程1已完成发送。在进程间通信方面使用管道,本地套接字,信号,共享内存或操作系统提供的任何内容。仅在"flushing" the socket之后发送信号(实际上没有刷新)。
答案 2 :(得分:0)
TCP套接字由元组标识,元组通常至少是(源IP,源端口,目标IP,目标端口)。不同的套接字具有不同的识别元组。
现在,如果在两个进程上使用相同的套接字,则它取决于write(2)调用的顺序。但是,您应该考虑到write(2)可能不会消耗您传递给它的所有数据,发送缓冲区可能已满,导致写入较短(write()小于请求,并返回写入返回值的字节数),导致write()阻塞/休眠,直到有一些缓冲区空间,或导致write()返回EAGAIN / EWOULDBLOCK错误(对于非阻塞套接字)。
答案 3 :(得分:0)
编辑:但如果我现在看到你在谈论每个进程的不同套接字,你的问题似乎毫无意义。应用程序无法知道TCP如何使用网络,这有什么关系? TCP将按照它认为合适的顺序以高达MTU的数据包进行传输。