对于TCP,确实从" write()"返回意味着对等应用程序具有" read()"数据?

时间:2018-02-14 06:17:43

标签: c sockets tcp network-programming

我正在编写C / S程序,客户端和服务器都可以在任意时间向对等方发送数据(没有显式确认)。我想知道如果客户端和服务器同时写入对等端,它是否可能死锁。

/** * Run same test function in NTHREADS in parallel. * @param ctask the task / test * @param loops number of loops to perform * @param cache whether jexl cache is used or not * @throws Exception if anything goes wrong */ @SuppressWarnings("boxing") void runThreaded(Class<? extends Task> ctask, int loops, boolean cache) throws Exception { if (loops == 0) { loops = MIX.length; } if (!cache) { jexl = jexlNoCache; } else { jexl = jexlCache; } java.util.concurrent.ExecutorService execs = java.util.concurrent.Executors.newFixedThreadPool(NTHREADS); List<Callable<Integer>> tasks = new ArrayList<Callable<Integer>>(NTHREADS); for (int t = 0; t < NTHREADS; ++t) { tasks.add(jexl.newInstance(ctask, loops)); } // let's not wait for more than a minute List<Future<Integer>> futures = execs.invokeAll(tasks, 60, TimeUnit.SECONDS); // check that all returned loops for (Future<Integer> future : futures) { Assert.assertEquals(Integer.valueOf(loops), future.get()); } } 返回是否意味着对等应用程序已经有write()个数据?或者它只意味着同行的内核已经获得了数据并将在下一个read()传递给应用程序?

(EJP&#39;答案修正了我对read()的完全错误的理解。为了添加一些权威信息,我在POSIX标准中发现了send

  

成功完成对send()的调用并不能保证传递消息。返回值-1表示仅检测到本地检测到的错误。

Linux关于write()/send()/...的手册页不太清楚:

  

send()中没有隐含传递失败的迹象。本地检测到的错误由返回值-1表示。

或者它是因为我不能完全理解第一句话是非英语母语人士。 )

2 个答案:

答案 0 :(得分:3)

没有。如果您将其视为数据管道,则从write返回意味着您的数据已输入管道,它已退出另一个管道端。

事实上,由于管道是数据可能采用数百种不同路径的管道,因此您甚至不能保证到达另一端:-)如果是如果发生这种情况,您可能会在以后某个时间收到通知,可能是后续 write失败。

可能被阻止:

  • 由于电缆断裂而试图退出机器,
  • 在某个地方的路上遇到瓶颈,
  • 通过目的地的网络堆栈,
  • 通过网络路径中某个设备的网络堆栈,比简单的集线器更智能,
  • 因为另一端的应用程序被绑定了,
  • 等等。

write成功返回意味着您的本地网络堆栈已接受您的数据,并会在适当的时候处理它。

答案 1 :(得分:3)

  

我想知道如果客户端和服务器同时写入对等端,它是否可能死锁。

它不能,除非一个或两个对等点读取速度很慢并且已关闭其接收窗口。 TCP是全双工的。

  

从write()返回是否意味着对等应用程序已经读取()数据?

没有

  

或者它只意味着对等方的内核已经获得了数据并且会在下次读取时传递给应用程序()?

没有

这意味着数据已到达您的内核,并排队等待传输。

  

从write()返回意味着已经收到TCP ACK。

不,不。

  

你的意思是从write()返回只意味着数据已经到达发送者的内核了吗?

这不仅仅是我的意思,也是我所说的。

  

我认为发送方已收到TCP ACK,因此已到达对等方的内核。

没有