Moduli


Definizione delle funzioni utilizzate dal progetto. Si notino in particolare le due macro connection() e make_socket() le quali includono tutte le primitive necessarie per realizzare una full association sia TCP che UDP (considerando anche il caso del Bcast) necessaria per la comunicazione in ambiente UNIX.

Questo file va incluso nella compilazione di tutti gli elementi del progetto.


Codice

/*
   moduli di inclusione
                       */
#include <sys/param.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <sys/wait.h>
#include <sys/time.h>
#include <time.h>
#include <string.h>
#include <signal.h>
#include <stdio.h>
#include <errno.h>
extern int errno;
typedef struct {
               unsigned short  stato_NS;
               char host_NS[24];
               unsigned short porta_mntr;
               unsigned short porta_replies;
               time_t tempo;
               } MSG_EL;

                  /****************************************/
 
				  
void put_into(MSG_EL*a,MSG_EL*b)
{
memset((MSG_EL*)a,0,sizeof(MSG_EL));
(*a).stato_NS=(*b).stato_NS;
strcpy((*a).host_NS,(*b).host_NS);
(*a).porta_mntr=(*b).porta_mntr;
(*a).porta_replies=(*b).porta_replies;
(*a).tempo=(*b).tempo;
}

                 /****************************************/

void clear_screen()
{
int pid;
if((pid=fork())==0)
  execl("/usr/bin/clear","clear",0);
else
  {
  waitpid(pid,0,0);
  return;
  }
}
  
                 /****************************************/

int make_socket(struct sockaddr_in *ptr_sock,int *sock_id,
		ushort port, char type,FILE *stream)
{
int optval=1;
memset((struct sockaddr_in *)ptr_sock,0,sizeof(struct sockaddr_in));
ptr_sock->sin_family=AF_INET;
ptr_sock->sin_addr.s_addr=INADDR_ANY;
ptr_sock->sin_port=htons(port);
if(type=='S')
  {
  if((*sock_id=socket(AF_INET,SOCK_STREAM,0))==-1)
    {fprintf(stream,"socket ls\n");return(1);}
  setsockopt(*sock_id,SOL_SOCKET,SO_REUSEADDR,(char *)&optval,sizeof(int));
  if(bind(*sock_id,(struct sockaddr *)ptr_sock,
  sizeof(struct sockaddr_in))==-1)
    {fprintf(stream,"bind ls server\n");return(1);}
  if(listen(*sock_id,5)==-1)
    {fprintf(stream,"listen\n");return(1);}
  }
else
 {
 if((*sock_id=socket(AF_INET,SOCK_DGRAM,0))==-1)
  {fprintf(stream,"socket dg\n");return(1);}
 setsockopt(*sock_id,SOL_SOCKET,SO_REUSEADDR,(char *)&optval,sizeof(int));
 if(bind(*sock_id,(struct sockaddr *)ptr_sock,\
 sizeof(struct sockaddr_in))==-1)
   {fprintf(stream,"bind claddr\n");return(1);}
 }
return(0);
}

                 /****************************************/

int connection(struct sockaddr_in *ptr_sock,int *sock_id,char *host,
		ushort port, char type,FILE *stream)
{
struct hostent *hp;
int optval=1;
memset((struct sockaddr_in *)ptr_sock,0,sizeof(struct sockaddr_in));
ptr_sock->sin_family=AF_INET;
ptr_sock->sin_port=htons(port);
if(type=='B')
  {
  ptr_sock->sin_addr.s_addr=inet_addr("192.168.255.255");
  if((*sock_id=socket(AF_INET,SOCK_DGRAM,0))==-1)
    {fprintf(stream,"socket datagram\n");return(1);}
  setsockopt(*sock_id,SOL_SOCKET,SO_BROADCAST,(char *)&optval,sizeof(int));
  }
else
  {
  if((hp=gethostbyname(host))==NULL)
    {fprintf(stream,"gethostbyname\n");return(1);}
  ptr_sock->sin_addr.s_addr=((struct in_addr *)(hp->h_addr))->s_addr;
  if(type=='S')
    {
    if((*sock_id=socket(AF_INET,SOCK_STREAM,0))==-1)
      {fprintf(stream,"socket stream\n");return(1);}
    if(connect(*sock_id,(struct sockaddr *)ptr_sock,sizeof(*ptr_sock))==-1)
      {fprintf(stream,"connect \n");close(*ptr_sock);return(1);}
    }
  else
    if((*sock_id=socket(AF_INET,SOCK_DGRAM,0))==-1)
      {fprintf(stream,"socket datagram\n");return(1);}
  }      
return(0);
}

                 /****************************************/

void demone()
{
register int childpid,fd;
if((childpid=fork())<0)
  perror("DEMONE: impossibile fork del primo figlio");
else
  if(childpid>0) exit(0);
if(setpgrp()==-1)
  perror("DEMONE:impossibile cambiare il gruppo di processi");
signal(SIGHUP,SIG_IGN);
if((childpid=fork())<0)
  perror("DEMONE:impossibile fork del secondo figlio");
else
  if(childpid>0) exit(0);
/*for(fd=0;fd<3;fd++) close(fd); se questa istruzione viene eseguita il codice non funziona. Non capisco il perchè !*/
errno=0;
/*per correttezza dovrebbe essere inserita una chdir("...") per assicurarsi
  che il demone non venga creato su di un FileSystem montato*/
}