当send()/recv()失败时。插座放在哪里?
假设我有一个通过当send()/recv()失败时。插座放在哪里?,c,sockets,networking,send,recv,C,Sockets,Networking,Send,Recv,假设我有一个通过socket()系统调用创建的套接字。之后,我做了一个connect(),并开始发送和接收数据 类似地,在另一端,使用socket()系统调用创建了一个套接字,然后调用了bind(),listen()和accept()。然后这一方也开始沟通 现在让我们假设一个send()(相应地,另一侧的recv())失败 我想知道的是,在发生故障后,该套接字将位于何处 要再次通信,我应该再次创建套接字并执行connect()(bind(),listen()和accept(),在另一侧)还是可以
socket()
系统调用创建的套接字。之后,我做了一个connect()
,并开始发送和接收数据
类似地,在另一端,使用socket()
系统调用创建了一个套接字,然后调用了bind()
,listen()
和accept()
。然后这一方也开始沟通
现在让我们假设一个send()
(相应地,另一侧的recv()
)失败
我想知道的是,在发生故障后,该套接字将位于何处
要再次通信,我应该再次创建套接字并执行connect()
(bind()
,listen()
和accept()
,在另一侧)还是可以再次尝试send()
和recv()
?此外,在这种情况下最好做什么
注意:我们不知道
send()
/recv()
失败的原因。它可以是任何东西,从物理断线到另一端拒绝(可能使用iptables)。怎么做完全取决于send
或recv
失败的原因
检测到错误时,检查errno
的值以确定原因。例如,如果错误代码为EAGAIN
,您将再次尝试该操作,如果错误代码为ECONNRESET
,则需要重新连接
请参阅手册页,了解可能返回的错误以及您应该如何处理这些错误的更多详细信息。然后,从断开的网络中恢复将导致检查所有返回值,然后检查相应的步骤?@Haris您最可能要检查的是
send
是否返回-1和errno
是ECONNRESET
。对于任何其他值,请安全地重试。确定。谢谢这很有帮助。