我的服务器程序(套接字流)正在运行,它接受客户端。由于某些异常情况,服务器被终止。另一方的客户端正在等待服务器回复。 如何将正在运行的客户端重新连接到新的服务器? sockets中有哪些函数可��使用?
我的服务器程序(套接字流)正在运行,它接受客户端。由于某些异常情况,服务器被终止。另一方的客户端正在等待服务器回复。 如何将正在运行的客户端重新连接到新的服务器? sockets中有哪些函数可��使用?
connect()
连接过一次的套接字 不能 被再次使用 connect()
进行连接。
连接 TCP 服务器并读写数据的步骤如下(伪代码):
sd = socket(...) // create socket descriptor (allocate socket resource)
connect(sd, server-address, ...) // connect to server
read/write(sd, data) // read from server
close(sd) // close /socket descriptor (free socket resource)
如果在connect
之后服务器出现问题,所有客户端能且应该做的就是:
在服务器恢复之前等待并重新尝试连接。
close(sd) // close socket descriptor (free socket resource)
并从头开始:
sd = socket(...) // create socket descriptor (allocate socket resource)
...
从头开始,以以下方式开始:
connect(sd, server-address, ...) // connect to server
...
可能会导致未定义的行为,但至少会产生错误。
int
connect_retry(int sockfd, const struct sockaddr *addr, socklen_t alen)
{
int nsec;
/*
* Try to connect with exponential backoff.
*/
for (nsec = 1; nsec <= MAXSLEEP; nsec <<= 1) {
if (connect(sockfd, addr, alen) == 0) {
/*
* Connection accepted.
*/
return(0);
}
/*
* Delay before trying again.
*/
if (nsec <= MAXSLEEP/2)
sleep(nsec);
}
return(-1);
}
这是《UNIX环境高级编程》一书推荐的内容。
你也可以使用以下方法:
setsockopt()
中的SO_REUSEADDR
。它允许重用本地地址。
您连接到新服务器的方式与连接到原始服务器的方式相同。这方面没有不同的API。我不明白为什么您会有其他想法。
您无法在服务器上处理此问题,但可以为客户创建会话,当客户重新连接时,恢复其设置并继续发送和接收消息。在客户端应用程序中创建一个具有特定间隔的线程来检查服务器是否可用,并尝试重新连接过程,但我建议您检查一下服务器端程序,看看发生了什么导致您的程序崩溃?
首先,让我说一下任何事情都是可能的。有一个函数可以为您完成这项工作。它就是您可能已经用于TCP客户端的connect
函数。您只需要考虑何时再次调用此连接即可。
connect
函数呢?让我提出一个可能的解决方案。
您需要一些监控软件(例如守护进程),以跟踪服务器进程的状态。它可以定期检查服务器进程是否处于活动状态。
考虑单个客户端和服务器的情况。客户端运行在A系统上;服务器运行在B系统上。
假设服务器在接收任何内容之前运行并崩溃。这意味着客户端已成功连接到服务器,但其send
将失败。当send
失败时,您可以联系位于B系统上的监控软件以了解发生了什么。
socket
、connect
、send
、recv
等过程。