2.用UDP心跳机制实现2个程序间的通讯 30分

2.用UDP心跳机制实现2个程序间的通讯  30分
程序A使用定时器每5秒向程序B发送一个消息。
程序B把收到的消息后,发一个ok给程序A.
如果程序A在10秒内没有收到程序B发送的ok消息,就在屏上打印ERROR
提示:心跳机制 类似 软件狗的功能, 有一个倒计时的时间,在倒计时完成后没有收到信息,则显示失败,如果在倒计时结束前收到了信息,则重新开始计时。这个功能需要进程专门起一个线程来做这个倒计时的工作。

A:

#include <sys/types.h> 
#include <sys/socket.h> 
#include<string.h> 
#include<arpa/inet.h> 
#include <stdio.h>
#include <time.h>
int num1=0,num2=0;
char buf[100];
int s1,s2;
time_t time_now ;
struct tm *time_p;
void * mtime()
{
    time_now = time(0);      //调用系统函数,并初始化
    time_p = gmtime(&time_now);
    printf( "The current time is :%d : %d :%d \n",time_p->tm_hour,time_p->tm_min,time_p->tm_sec );
             //临时参数,用来与当前时间比较
         s1=s2=time_p->tm_sec;
       int t1,t2;
    
        while (1)
       {
             if((t1=(time_p->tm_sec-s1))==5)
               {
                   s1= time_p->tm_sec;
                   num1=1;
                 
               }
               if((t2=(time_p->tm_sec-s2))==10)
               {
                  s2= time_p->tm_sec;
                  num2=1;
                
                 
               }
               sleep(1);
               time_now = time(0);  
               time_p = gmtime(&time_now);
            
        }        
}
void *mrecv(void * sockfd)
{ 
    int socklen;
     struct sockaddr_in servaddr;
     socklen =sizeof (servaddr);
   while(1)
   {
    if(recvfrom(*((int *)sockfd),buf,10,0,NULL,NULL)<=0)
    {
       perror("rexcv error");
    }
    else 
    {
     time_now = time(0);  
    time_p = gmtime(&time_now);
     s2= time_p->tm_sec;
    num2=0;
    s2=
    printf("%s\n",buf);
      
    }
     bzero(buf,100);
     }
}
int sockfd;
void * msock()
{
 
  struct sockaddr_in servaddr,cliaddr; 
   
    
   if((sockfd=socket(AF_INET,SOCK_DGRAM,0))<0) 
   { 
     perror("socket error"); 
     return ; 
   } 
      bzero (&servaddr,sizeof(servaddr));
    servaddr.sin_family=AF_INET; 
    servaddr.sin_port=htons(8884); 
    servaddr.sin_addr.s_addr=inet_addr("127.0.0.1");//
    bzero(&cliaddr,sizeof(cliaddr));
    cliaddr.sin_family= AF_INET;
    cliaddr.sin_port=htons(7776);
    cliaddr.sin_addr.s_addr=inet_addr("127.0.0.1");
    
    
    if (bind(sockfd,(struct sockaddr *)&cliaddr,sizeof(cliaddr))<0)
    {
        perror("bind error");
        return ;
    }
    num1=1;
    while (1)
    { 
    if(num1==1)
    {
    sendto(sockfd,"OK_server",10,0,(struct sockaddr *)&servaddr,sizeof(servaddr));
    num1=0;
    }
  
 
    if (num2==1)
    {
     printf("%s\n","ERROR");
       close(sockfd);
       break;
    }
     
   }
}
int main () 
{ 
  
   pthread_t thread_1,thread_2,thread_3;
   
   pthread_create(&thread_1,NULL,mtime,NULL); 
   pthread_create(&thread_2,NULL,msock,NULL);
  
   
    pthread_create(&thread_3,NULL,mrecv,(void *)&sockfd);
  
   pthread_join(thread_1,NULL);
  pthread_join(thread_2,NULL);
  pthread_join(thread_3,NULL);
          
    return 0;
    
}

B:

#include <sys/types.h>
#include <sys/socket.h>
#include<string.h>
#include<arpa/inet.h>
#include <stdio.h>
int main ()
{
   int sockfd;
   struct sockaddr_in myaddr,cliaddr;
   int socklen;
   char buf[100],buffer[100]="hello client";
   if((sockfd=socket(AF_INET,SOCK_DGRAM,0))<0)
   {
     perror("socket error");
     return -1;
   }
    bzero (&myaddr,sizeof(myaddr));
    myaddr.sin_family=AF_INET;
    myaddr.sin_port=htons(8884);
    myaddr.sin_addr.s_addr=inet_addr("127.0.0.1");//
    
    if(bind(sockfd,(struct sockaddr*)&myaddr,sizeof(myaddr))<0)
    {
      perror("bind error");
      return -1;
    }
    while(1)
    {
    socklen=sizeof(cliaddr);
    recvfrom (sockfd,buf,10,0,(struct sockaddr *)&cliaddr,&socklen);
    printf("%s\n",buf);
    sendto (sockfd,"OK_client",10,0,(struct sockaddr *)&cliaddr,socklen);
    }
    
   
  return 0;
}


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值