मेरे पास एक क्लाइंट सर्वर (टीसीपी कनेक्शन) से जुड़ा हुआ है। जब सेवा जारी रखने के लिए सर्वर क्रैश हो जाता है (मैं इसे डिस्कनेक्ट करता हूं) तो मेरे क्लाइंट को किसी अन्य सर्वर से कनेक्ट करने की आवश्यकता होती है। लेकिन जब पहला सर्वर वापस आता है, तो मुझे क्लाइंट को फिर से कनेक्ट करने की आवश्यकता होती है। पहले सर्वर क्रैश होने के बाद मैं अपने क्लाइंट को बैक अप सर्वर से कनेक्ट करने में सक्षम था, लेकिन मुझे अपने क्लाइंट को पहले सर्वर से दोबारा जोड़ने में समस्या है। मैंने सर्वर से पुनः कनेक्ट करने के लिए 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