Ho un client connesso al server (connessione TCP). Nel caso in cui il server si blocchi (lo disconnetto), il mio client deve essere connesso a un altro server, al fine di continuare il servizio. Ma quando ritorna il primo server, devo ricollegare il client nuovamente. Sono riuscito a connettere il mio client al server di backup dopo il primo arresto anomalo del server, ma ho un problema con la riconnessione del mio client al primo server. Ho creato una funzione per la riconnessione al server, create_newconnect()
, ma non funziona (è per questo che non lo chiamo nel codice) Ho provato a semplificare il mio programma il più possibile, quindi non sarebbe stato al grande Questo è un lato clientripristinare la connessione al server dopo l'arresto anomalo
#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
}
Sarebbe utile sapere cosa non funziona per te e la diagnostica che vedi. Posso vedere una serie di problemi nel codice, ma farlo funzionare contro un servizio di test che ho implementato potrebbe non risolvere i tuoi problemi. La tua situazione reale ha il client e sia il server principale che quello di backup si trovano tutti nello stesso host o è un artefatto della versione di prova? Stai cercando di risolvere questo programma di test o hai trovato risposte su come risolvere il problema originale di un client che si guasta automaticamente tra server primari e server di backup? – gwaigh