gpt4 book ai didi

c - 崩溃后恢复与服务器的连接

转载 作者:可可西里 更新时间:2023-11-01 02:31:40 26 4
gpt4 key购买 nike

我有一个连接到服务器的客户端(TCP 连接)。在服务器崩溃(我断开连接)的情况下,我的客户端需要连接到另一台服务器,以便继续服务。但是当第一台服务器回来时,我需要再次将客户端重新连接到它。在第一台服务器崩溃后,我能够将我的客户端连接到备份服务器,但是我在将我的客户端重新连接到第一台服务器时遇到了问题。我创建了一个函数 create_newconnect() 用于重新连接到服务器,但它不起作用(这就是为什么我没有在代码中调用它)我尽量简化我的程序,所以它不会太大这是客户端

#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <signal.h>
#include <string.h>
#include <arpa/inet.h>
#include <time.h>
#define SIZE sizeof(struct sockaddr_in)


struct sockaddr_in server;
void tcp_protocol();//execute client tcp protocol
void server_check();
void tcp();
void create_newconnect();

int main (int argc, char *argv[])
{

int portno;

//Test for correct number of arguments
if (argc != 3)
{
fprintf(stderr, "Usage: %s Port# IP Address \n", argv[0]);
exit(1);
}
portno = atoi(argv[1]);//convert port # to int
server.sin_family = AF_INET;
server.sin_port = htons(portno);
server.sin_addr.s_addr = inet_addr(argv[2]);//use client ip address
tcp();//call tcp function
return 0;
}
void tcp()
{
int sockfd;
char c ;
//create socket
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0))==-1)
{
perror ("socket call faild");
exit (1);
}
//connect to the server
if (connect (sockfd, (struct sockaddr *)&server, SIZE)==-1)
{
perror ("connect call faild");
exit (1);
}
while(1)
{
printf("Enter char\n");
scanf("%c",&c);
server_check(sockfd);
//send packet to server
if (send(sockfd, &c, sizeof(c),0)<0)
{
printf("error sending\n");
}
//if packet is received from server
if(recv(sockfd, &c, sizeof(c),0)>0)
{
printf("server's respond %c\n", c);//print result
}
}
close(sockfd);
}


void server_check(int sock)
{
char b ='b';
//send packet to server
if (send(sock, &b, sizeof(b),0)<0)
printf("error sending\n");
//if packet is received from server
if((recv(sock, &b, sizeof(b),0)>0))
{
printf("server responded\n");

}
else//if server is not responding
{
printf("server crashed\n");
close(sock);//close socket
server.sin_port = htons(5002);
server.sin_addr.s_addr = inet_addr("127.0.0.1");
tcp();//create new connection
}


}
void create_newconnect()
{
int newsockfd;
server.sin_port = htons(5001);
//create socket
if ((newsockfd = socket(AF_INET, SOCK_STREAM, 0))==-1)
{
perror ("socket call faild");
exit (1);
}
//connect to the server
if (connect (newsockfd, (struct sockaddr *)&server, SIZE)==-1)
{
perror ("connect call faild");
exit (1);
}
tcp();//call function to execute tcp protocol

}

最佳答案

我认为您首先要考虑的是:在您的第一台服务器崩溃并且您的客户端已成功重新连接到备份服务器后,您的客户端如何知道第一台服务器已恢复正常行?

我可以想到两种可能性:一种可能是备份服务器可能会通知客户端主服务器的重新出现(例如,通过 TCP 连接发送某种 PRIMARY_SERVER_ONLINE 消息,或者可能只是关闭TCP 连接,期望这会导致客户端再次尝试连接到主服务器)。

另一种方法是让您的客户端足够智能,即使它正在使用到备份服务器的 TCP 连接,它也可以定期(例如每分钟一次)尝试重新连接到主服务器。这是可行的,但不能像您发布的代码那样使用单个线程和阻塞 I/O ...(因为如果您的程序在 recv() 调用中被阻塞,它就无法执行其他任何操作,例如尝试连接一个 TCP 连接)。您需要使用非阻塞 I/O 和 select()(或类似方法)、异步 I/O 或多线程才能正确执行此操作。

关于c - 崩溃后恢复与服务器的连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20157726/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com