我有一個客戶端連接到服務器(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