/*This program provide common functions for client, dispatcher and server.*/
#include "service.h"
/* A common functions called by both client and server to connect to remote.
i.e. server connects dispatcher, client connects server.*/
int connect_remote(char *dest,int port,int *sock,struct sockaddr_in *serv_addr)
{
/*struct hostent *server;*/
int status=0; /*to contain the value to return.*/
/*int yes=1;*/
struct hostent *server;
/*if sock fails, return 1.*/
if ( (*sock = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
perror("socket");
status++;
return status;
}
/*set up the destination address sockaddr_in structure.*/
if((server = gethostbyname(dest))==NULL)
{
printf("\n");
perror("gethostbyname");
status++;
return status;
}
memset(serv_addr,0,sizeof(struct sockaddr_in));
serv_addr->sin_family = AF_INET;
serv_addr->sin_addr.s_addr=((struct in_addr *)server->h_addr)->s_addr;
serv_addr->sin_port = htons(port);
/*if connect fails, return 1.*/
if (connect(*sock,(struct sockaddr *)serv_addr,sizeof(struct sockaddr)) ==-1)
{
printf("\n");
perror("connect");
status++;
return status;
}
if(status==0) printf("Done!\n");
return status;
}
/*A common function called by both dispatcher and server.It first create a
socktet, then bind the socket with a port, and listen on this port.If fails,
return 1,otherwise return 0.*/
int bind_remote(int port,int *sockfd,struct sockaddr_in *my_addr)
{
int status=0; /*To contain the value to return.*/
int yes=1;
/*if sock fails, status will be 1, and return it.*/
if ( (*sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
perror("socket");
status++;
return status;
}
/*set up the my_addr sockaddr_in structure.*/
my_addr->sin_family = AF_INET;
my_addr->sin_addr.s_addr = htonl(INADDR_ANY);
my_addr->sin_port = htons(port);
memset(&(my_addr->sin_zero), '\0', 8);
/*make the socket(port) re_usable for bind() */
if (setsockopt(*sockfd, SOL_SOCKET, SO_REUSEADDR,(const void *) &yes, sizeof(int))==-1)
{
perror("setsockopt");
status++;
return status;
}
/*associate the socket with a port on the machine, if fails, status
will be set to 1.*/
if ( bind (*sockfd, (struct sockaddr *) my_addr,
sizeof(struct sockaddr)) < 0)
{
perror("bind");
status++;
return status;
}
/*listen on this port, if listen fails, status will be set to 1, and
return it.*/
if (listen(*sockfd, MAX_QUEUE) < 0)
{
perror("listen");
status++;
return status;
}
return status;
}