私はクライアントをサーバーに接続しています(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
}
あなたとあなたが見る診断のためにうまくいかないことを知ることは役に立ちます。私はコード内でいくつかの問題を見ることができますが、私が実装したテストサービスに対して動作させることは、あなたの問題に対処できないかもしれません。あなたの実際の状況は、クライアントとプライマリサーバとバックアップサーバの両方がすべて同じホストに存在するのでしょうか、それともテストバージョンの成果物ですか?このテストプログラムを修正したいのですか、プライマリサーバーとバックアップサーバーの間で自動的に失敗するクライアントの元の問題を解決する方法についての回答はありますか? – gwaigh