当 send()/recv() 失败时。插座在哪里?

When send()/recv() fails. Where does the socket stands?

假设我有一个由 socket() 系统调用创建的套接字。之后我做了 connect() 并开始发送和接收数据。

同样,在另一边,用socket()系统调用创建了一个套接字,然后调用了bind()listen()accept()。然后这边也开始交流了

现在让我们假设其中一个 send()(相应地 recv() 在另一侧)失败了。

我想要什么失败后那个插座会站在哪里?

要再次通信,我应该重新创建套接字并在另一侧执行 connect()bind()listen()accept())还是我可以尝试 send()recv() 又一次?此外,在这种情况下最好的做法是什么?

注意: 我们不知道 send()/recv() 失败的原因是什么。它可以是任何东西,从物理断线到另一方拒绝(可能使用 iptables)。

要做什么完全取决于 sendrecv 失败的原因。

检测到错误时,检查errno的值以确定原因。例如,如果错误代码是 EAGAIN,您将再次尝试该操作,如果错误代码是 ECONNRESET,您将需要重新连接。

请参阅 send and recv 的手册页,了解有关可能返回哪些错误以及您应该如何处理这些错误的更多详细信息。