#include <sys/types.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <netinet/in.h>
#include <arpa/inet.h rel='nofollow' onclick='return false;'>
#include <errno.h>
#include <fcntl.h>
#include <netdb.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/uio.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/un.h>
#include <sys/ddi.h>
static int servfd;
static int nsec; /* seconds between each alarm */
static int maxp; /* probes w/no response before quit*/
static int nprobes; /* probes since last server response*/
static void sig_urg(int);
static void sig_alm(int);
void heartbeat_cli(int servfdx,int nsecx,int maxpx);
void client_str(FILE* fp,int sockfd);
int main(int argc,char** argv)
{
int sockfd,n;
char recvline[1000+1];
struct sockaddr_in servaddr;
if(argc!=2)
{
printf("error1!\n");
exit(0);
}
if (( sockfd = socket(AF_INET,SOCK_STREAM,0)) < 0)
{
printf("sock error !\n");
exit(0);
}
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(1388);
servaddr.sin_addr.s_addr = inet_addr(argv[1]);
if( connect(sockfd,(struct sockaddr*)&servaddr,sizeof(servaddr)) < 0)
{
printf("connect error!\n");
exit(0);
}
client_str(stdin,sockfd);
exit(0);
}
void heartbeat_cli(int servfdx,int nsecx,int maxpx)
{
servfd = servfdx;
if((nsec = nsecx) < 1)
nsec = 1;
if((maxp = maxpx) < nsec)
maxp = nsec;
nprobes = 0;
signal(SIGURG,sig_urg);
fcntl(servfd,F_SETOWN,getpid());
signal(SIGALRM,sig_alm);
alarm(nsec);
}
void client_str(FILE* fp,int sockfd)
{
int maxfdp1,stdineof;
fd_set rset;
char sendline[1000],recvline[1000];
int n;
int ret;
stdineof = 0;
FD_ZERO(&rset);
heartbeat_cli(sockfd,1,5);
for(;;)
{
if(stdineof == 0)
FD_SET(fileno(fp),&rset);
FD_SET(sockfd,&rset);
maxfdp1 = max(fileno(fp),sockfd) + 1;
if((ret = select(maxfdp1,&rset,NULL,NULL,NULL)) == EINTR)
continue;
if(FD_ISSET(sockfd,&rset)) /* socket is readable*/
{
if(( n = read(sockfd,recvline,1000)) == 0)
{
if(stdineof == 1)
return;
else
printf("client_str:server terminated premature!\n");
return;
}
recvline[n] = 0;
fputs(recvline,stdout);
/* write(stdout,recvline,n);*/
}
if(FD_ISSET(fileno(fp),&rset)) /* input is readable*/
{
if(fgets(sendline,1000,fp) == NULL)
{
stdineof = 1;
shutdown(sockfd,SHUT_WR); /* send FIN */
FD_CLR(fileno(fp),&rset);
continue;
}
write(sockfd,sendline,strlen(sendline));
}
}
}
static void sig_urg(int signo)
{
int n;
char c;
if((n = recv(servfd,&c,1,MSG_OOB)) < 0)
{
if(errno != EWOULDBLOCK)
printf("receive error!\n");
}
nprobes = 0;
return;
}
static void sig_alm(int signo)
{
printf("this is client's %d \n",nprobes);
nprobes++;
printf("this is client's %d \n",nprobes);
if(nprobes > maxp)
{
printf("server is unreachable!\n");
exit(0);
}
printf("this is client's %d \n",nprobes);
send(servfd,"1",1,MSG_OOB);
alarm(nsec);
return;
}