我的服务器程序(套接字流)正在运行,它接受客户端。由于某些异常情况,服务器将被终止。对方客户端正在等待服务器回复。 如何将正在运行的客户端重新连接到新服务器?套接字中的任何函数?
答案 0 :(得分:3)
一次<{>} / p>
连接到TCP服务器和读/写一些数据的步骤如下(伪代码):
connect()
如果服务器在connect()
之后关闭,则所有客户端可以做和将要做的是
fd = socket(...) // create socket descriptor (allocate socket resource)
connect(fd, server-address, ...) // connect to server
read/write(fd, data) // read from server
close(fd) // close /socket descriptor (free socket resource)
然后从以下开始:
connect
从头开始:
close(fd) // close /socket descriptor (free socket resource)
可能会导致未定义的行为,但至少会导致错误。
答案 1 :(得分:1)
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环境手册中由高级编程引用。
您也可以使用:
SO_REUSEADDR
中的 setsockopt()
。它允许重用本地地址。
答案 2 :(得分:1)
首先我要说一切皆有可能。有一个功能可以为您做到这一点。它与您可能用于TCP客户端的connect
相同。您只需要考虑何时需要再次调用此连接。
connect
函数?让我提出一个可能的解决方案。
您需要使用某种监控软件(可能是daemon)来跟踪服务器进程的状态。例如,它可以定期戳服务器进程以查看它是否还活着。
考虑单个客户端和服务器的情况。客户端在系统A上运行;服务器,在系统B上。
假设服务器在recv
编辑任何内容之前已经运行并崩溃。这意味着客户端已成功连接到服务器,其send
将失败。当send
失败时,您可以联系系统B上的监控软件以查看发生的情况。
如果监控软件报告它没有发现服务器有任何问题,那么其他一些问题就出现了(可能是中断,你的网卡无论如何)。这些原因超出了本次讨论的范围。
如果您的监控软件回复说它发现服务器程序已经死亡,那么您可以:
现在,在系统A的客户端中,再次开始socket
,connect
,send
,recv
等过程。
基本上,您正在创建另一个服务器X,它负责管理您当前的服务器Y.当服务器Y死亡时,您会查找服务器X的原因。
答案 3 :(得分:0)
以与连接到原始服务器相同的方式连接到新服务器。这没有不同的API。我不明白为什么你会这么想..
答案 4 :(得分:0)
您无法在服务器中处理此问题但您可以为客户端创建会话,然后当客户端重新连接时恢复其设置并继续发送和接收消息,并在客户端应用程序中创建具有特定间隔的线程以检查是否服务器是否可用如果是,请尝试重新连接程序但是,我建议您检查服务器端程序,程序发生了什么变化?