从已经关闭的套接字接收数据?

Kir*_*rov 6 c c++ unix sockets client-server

假设我有一个服务器应用程序 - 使用UNIX套接字通过TCP连接.

连接是异步的 - 换句话说,客户端和服务器的套接字是非阻塞的.

假设以下情况:在某些情况下,服务器可能决定将某些数据发送到连接的客户端并立即关闭连接:使用shutdownwith SHUT_RDWR.

所以,我的问题是 - 是否有保证,当客户端调用时recv,它会收到(由服务器发送)数据?

或者,要接收数据,recv必须在服务器之前调用shutdown?如果是这样,我应该做什么(或者,更确切地说,我该怎么做),以确保客户收到数据?

pau*_*sm4 5

您可以使用"setsockopt(SO_LINGER)"控制此行为:

SO_LINGER如果存在数据,则等待完成关闭功能.如果启用此选项并且在调用close函数时存在未发送的数据,则在关闭函数期间将阻止调用应用程序,直到数据被传输或连接超时.close函数返回而不阻塞调用者.此选项仅对流套接字有意义.

也可以看看:

  • 这究竟如何回答这个问题?他没有问如何控制发送者的行为,而是问接收者的行为是什么。设置逗留超时并不会改变这一点。(将其“关闭”确实可以,但您没有提到这一点。) (2认同)
  • 这不能回答问题 (2认同)

use*_*421 5

无法保证您将收到任何数据,更不用说这些数据,但是套接字关闭时待处理的数据与所有其他数据一样受到保证:如果它到达它将按顺序到达并且没有损坏且受TCP最佳限制努力.

NB'异步'和'非阻塞'是两个不同的东西,而不是同一个东西的两个术语.