Ich habe einen Client mit dem Server verbunden (TCP-Verbindung). In dem Fall, wenn der Server abstürzt (ich trenne ihn), muss mein Client mit einem anderen Server verbunden sein, um den Dienst fortzusetzen. Aber wenn der erste Server zurückkommt, muss ich den Client erneut mit ihm verbinden. Ich konnte meinen Client mit dem Sicherungsserver verbinden, nachdem der erste Server abgestürzt ist, aber ich habe ein Problem damit, meinen Client wieder mit dem ersten Server zu verbinden. Ich habe eine Funktion create_newconnect()
für die Wiederverbindung mit dem Server, aber es funktioniert nicht (deshalb ich rufe es nicht im Code) Ich habe versucht, mein Programm zu vereinfachen, so viel wie ich konnte, so wäre es nicht zu groß Dies ist eine Client-SeiteWiederherstellung der Verbindung zum Server nach dem Absturz
#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
}
Es wäre hilfreich zu wissen, was für Sie nicht funktioniert und die Diagnose, die Sie sehen. Ich kann eine Reihe von Problemen im Code feststellen, aber die Implementierung gegen einen von mir implementierten Testdienst kann Ihre Probleme möglicherweise nicht beheben. Hat Ihre reale Situation, dass der Client und der Primär- und der Backup-Server alle auf demselben Host liegen, oder ist das ein Artefakt Ihrer Testversion? Möchten Sie, dass dieses Testprogramm repariert wird oder Antworten auf die Frage gibt, wie Sie das ursprüngliche Problem eines Clients beheben können, der automatisch zwischen primären und Backup-Servern ausfällt? – gwaigh