【发布时间】:2013-11-23 02:19:04
【问题描述】:
我有一个客户端连接到服务器(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
}
【问题讨论】:
-
了解什么不适合您以及您看到的诊断信息会很有帮助。我可以在代码中看到许多问题,但是使其与我实现的测试服务一起工作可能无法解决您的问题。您的真实情况是否有客户端以及主服务器和备份服务器都驻留在同一主机上,还是您的测试版本的工件?您是否希望修复这个测试程序,或者回答如何解决客户端在主服务器和备用服务器之间自动失败的原始问题?
标签: c sockets networking tcp