2016-05-20 28 views
1

假设我有一个由socket()系统调用创建的套接字。之后,我做了一个connect()并开始发送和接收数据。当send()/ recv()失败时。插座站在哪里?

同样,另一方面,用socket()系统调用创建套接字,然后调用bind(),listen()accept()。然后这边也开始沟通。

现在让我们假设其中一个send()(以及相应的recv())失败。

我想要在失败后插座的位置在哪里?

要再次沟通,我应该再创建套接字和(另一侧bind()listen()accept())做connect()或者我可以再次尝试send()recv()?另外,在这种情况下要做的最好的事情是什么?

注:我们不知道什么是对send()/recv()的原因失败。它可以是任何物理断线到另一侧拒绝(也许使用iptables)。

回答

2

怎么办完全取决于为什么sendrecv失败。

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

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

+0

然后从破损的网络中恢复将导致检查所有返回值,然后相应地采取步骤? – Haris

+0

@Haris最有可能检查的是'send'返回-1,'errno'是'ECONNRESET'。对于任何其他价值,再次尝试应该是安全的。 – dbush

+0

好的。谢谢。这有帮助。 – Haris