C++ TCP/IP客户端在服务器关闭后重新连接

C++ TCP/IP客户端在服务器关闭后重新连接,c++,tcp,C++,Tcp,我遇到的情况是,客户端连接的服务器可能会在客户端仍在运行的情况下重复关闭 在当前的实现中,当客户端读取失败时,它将调用close(sockFd)关闭套接字。然后它将循环尝试重新创建该套接字 这是最佳做法吗?或者可以离开插座并尝试连接到它吗 编辑:平台是Linux当你在一个套接字上得到除EINTR或EAGAIN/eWoldBlock以外的任何错误时,它几乎肯定是死的,必须关闭@abarnert在下面的有用评论中给出了一些其他问题。这是一个特定于平台的问题。对于TCP没有通用的C++ API,根据B

我遇到的情况是,客户端连接的服务器可能会在客户端仍在运行的情况下重复关闭

在当前的实现中,当客户端读取失败时,它将调用
close(sockFd)
关闭套接字。然后它将循环尝试重新创建该套接字

这是最佳做法吗?或者可以离开插座并尝试连接到它吗


编辑:平台是Linux

当你在一个套接字上得到除
EINTR
EAGAIN/eWoldBlock
以外的任何错误时,它几乎肯定是死的,必须关闭@abarnert在下面的有用评论中给出了一些其他问题。

这是一个特定于平台的问题。对于TCP没有通用的C++ API,根据BSD套接字的准标准,试图在关闭或出错的套接字上再次调用<代码>连接< /代码>,应该提高EnValAL(22)。在某些平台上,它实际上无论如何都能工作,但这显然是不安全的,而且在它工作的平台上甚至没有文档记录。更重要的是,这真的没有什么好处;与使用
connect
@DavidSchwartz建立TCP连接相比,使用
socket
创建一个新的套接字对象所需的时间很小:他谈论套接字和套接字API的事实意味着他谈论的是BSD/POSIX/WinSock2/等套接字,这与universal非常接近(只要忽略细微差别);没有太多支持TCP但没有套接字的平台。代码正在操作Linux环境,将编辑OP。问题的目的更多地是关于客户端应如何重新连接以及在必要时进行清理。当然,
EINTR
不会终止套接字。并且有一些错误定义为在让套接字保持活动状态的情况下,最明显的是
EINPROGRESS
(否则将不会非常有用),尽管确切的列表是特定于平台的。最后是一些错误(例如,传递空指针导致的
EFAULT
)通常不会杀死套接字,但由于其他原因很难恢复。无论如何,通常这是正确的想法。