- 论坛徽章:
- 0
|
问题是这样的,a与c机正常通讯,若出现异常则通知b机,b机做出判断,告诉a和c机重新启动。现在问题是不能实现应有的结果。请帮我分析,以下是代码:a.c
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <errno.h>
#include <sys/wait.h>
#include <signal.h>
#define BUF_SIZE 1000
#define PROTOPORT1 6001 /* default protocol port number */
#define PROTOPORT2 6002
int check()
{
struct sockaddr_in myaddr;
struct sockaddr_in cad;
int s6,s7; /* socket descriptor */
fd_set connect_sock_set;
struct timeval connect_sock_tv;
int i,alen,j;
int port; /* protocol port number */
char buf[BUF_SIZE];
s7=socket(PF_INET, SOCK_STREAM, 0);
if (s7<0) {
printf("socket s7 creation failed \n,%s\n",strerror(errno));
exit(1);
}
printf("socket s7 is over \n");
memset((char *)&myaddr,0,sizeof(myaddr)); /* clear sockaddr structure */
myaddr.sin_family = PF_INET; /* set family to Internet */
myaddr.sin_addr.s_addr = inet_addr("192.168.0.191");
port = PROTOPORT1; /* use default port number */
myaddr.sin_port = htons((u_short)port);
if (bind(s7, (struct sockaddr *)&myaddr, sizeof(myaddr)) < 0) {
printf("bind s7 failed \n,%s\n",strerror(errno));
close(s7);
exit(1);
}
printf("bind s7 over! \n");
if(listen(s7,BUF_SIZE)<0){
printf("listen s7 failed \n,%s\n",strerror(errno));
close(s7);
exit(1);
}
printf("listen from outer is over !\n");
FD_ZERO(&connect_sock_set);
FD_SET(s7, &connect_sock_set);
connect_sock_tv.tv_sec = 120;
connect_sock_tv.tv_usec = 0;
i=select(s7+1,&connect_sock_set, NULL, NULL, &connect_sock_tv);
if(i<0){
printf("s7 timeoff! \n,%s\n",strerror(errno));
close(s7);
return (-1);
}
printf("select is made !\n");
//select(s7+1,&connect_sock_set, NULL, NULL, &connect_sock_tv);
if(FD_ISSET(s7,&connect_sock_set)){
printf("inner and outer commucate rightly \n");
alen = sizeof(cad);
if ( (s6=accept(s7, (struct sockaddr *)&cad, &alen)) < 0) {
printf(" accept s7 from outer failed\n,%s\n",strerror(errno));
close(s6);
close(s7);
return -1;
}
printf("accept from outer is right!\n");
j=recv(s6, buf, 1000, 0);
if( j<0){
printf("recv from outer failed \n,%s\n",strerror(errno));
close(s7);
close(s6);
return -1;
}
printf("recv from outer is right !\n");
strncpy(buf,"check right",10);
if( send(s6,buf,1000,0)<0){
printf("send to outer and ask whether to reboot failed\n,%s \n",strerror(errno));
close(s7);
close(s6);
return -1;
}
printf("send data to outer is right!\n");
close(s6);
printf("close s6 in check() if!\n");
}
else{
printf("s7 timeoff! \n,%s\n",strerror(errno));
close(s6);
printf("close s6 in check() else!\n");
return (-1);
}
close(s7);
printf("close s7 in check()\n ");
return 0;
}
void report()
{
struct sockaddr_in theiraddr;
struct sockaddr_in myaddr;
int s1,s4; /* socket descriptor */
char buf[BUF_SIZE];
int port; /* protocol port number */
int alen;
int numbytes;
char * message_str="prepare to stop inner and outer";
s4 = socket(PF_INET, SOCK_STREAM, 0);
if (s4 < 0) {
printf("socket s4 creation failed \n,%s\n",strerror(errno));
exit(1);
}
printf("socket s4 creat succeed \n");
memset((char *)&myaddr,0,sizeof(myaddr)); /* clear sockaddr structure */
myaddr.sin_family = AF_INET; /* set family to Internet */
myaddr.sin_addr.s_addr = inet_addr("192.168.250.101");
port = PROTOPORT2; /* use default port number */
myaddr.sin_port = htons((u_short)port);
if (connect(s4, (void *)&myaddr, sizeof(myaddr)) < 0) {
printf("connect to middle and to reboot failed \n,%s\n",strerror(errno));
close(s4);
exit(1);
}
printf("connect and report to halt information to middle and connect succeed \n");
if(send(s4,message_str,strlen(message_str),0)<0){
printf("send info to middle to reboot failed \n,%s\n",strerror(errno));
close(s4);
exit(1);
}
printf("send info and wait for middle detatition and make inner to halt \n");
close(s4);
printf("close socket s4 in report() \n");
/*if(recv(s4,buf,sizeof(buf),0)<0){
printf("recv failed \n");
close(s4);
exit(1);
}*/
}
int halt()
{
struct sockaddr_in myaddr;
struct sockaddr_in theiraddr;
int s1,s4; /* socket descriptor */
char * message_str="quit";
int i,alen;
int port; /* protocol port number */
char buf[BUF_SIZE];
int numbytes;
s4 = socket(PF_INET, SOCK_STREAM, 0);
if (s4 < 0) {
printf("socket s4 creation failed \n,%s\n",strerror(errno));
exit(1);
}
printf("create socket s4 over \n");
memset((char *)&myaddr,0,sizeof(myaddr)); /* clear sockaddr structure */
myaddr.sin_family = PF_INET; /* set family to Internet */
myaddr.sin_addr.s_addr = inet_addr("192.168.250.102");
port = PROTOPORT2; /* use default port number */
myaddr.sin_port = htons((u_short)port);
if (bind(s4, (struct sockaddr *)&myaddr, sizeof(myaddr)) < 0) {
printf("bind s4 to middle and have get info to reboot failed\n,%s\n ",strerror(errno));
close(s4);
exit(1);
}
printf("bind sockedt s4 to inner right and prepare to reboot \n");
if(listen(s4,BUF_SIZE)<0) {
printf("listen s4 to middle and get info to reboot failed \n,%s\n",strerror(errno));
close(s4);
exit(1);
}
printf("listen the middle to send infomation and keep waiting \n");
alen=sizeof(theiraddr);
if(s1=accept(s4,(struct sockaddr*)&theiraddr,&alen)<0){
printf("MIDDLE: accept s4 from middle and get info to reboot failed\n,%s\n",strerror(errno));
close(s4);
close(s1);
exit(1);
}
printf("accept middle and prepare to reboot \n");
if(recv(s1,buf,sizeof(buf),0)<0){
printf("detation :recv s4 from middle failed \n,%s\n",strerror(errno));
close(s1);
close(s4);
return -1;
}
printf("recv middle information and prepare to judge whether to reboot \n");
if(strcmp(buf,message_str)==0){
return (1);
}
printf("judge over ");
close(s1);
printf("close socket s1 in halt()\n");
close(s4);
printf("close socket s4 in halt()\n");
return 0;
}
int main(int argc, char** argv)
{
int i,j;
while(1){
i=check();
if(i<0){
report();
while(1){
j=halt();
if(j=1){
system("reboot");
}
}
}
}
} |
|