Exemple #1
0
/*This function will create and monitor the socket*/
void createmonitorSocket(char *lan_name)
{
 int sockfd;
 int recv_sockfd;
 int clients[no_ports];
 int counter;
 BridgeEntry* bridgetable[no_ports];
 struct sockaddr_in addr;
 struct sockaddr_in recv_addr;
 fd_set allset;
 fd_set resset;
 int maxfd;
 int len;
 char* token_accept="accept";
 char* token_reject="reject";
 char* token_table="table";
 char* read_line;
 char** command_arguments;
 sockfd=socket(AF_INET,SOCK_STREAM,0);
 if (sockfd<0)
 {
  printf("Unable to create socket\n");
  exit(0);
 }
 addr.sin_addr.s_addr=INADDR_ANY;
 addr.sin_port=htons(0);
 addr.sin_family=AF_INET;
 if (bind(sockfd,(struct sockaddr *)&addr,sizeof(addr))<0)
 {
  perror("Bind:");
  exit(0);
 }
 storesocketinfo(sockfd,lan_name);
 maxfd=sockfd;
 FD_ZERO(&allset);
 FD_SET(sockfd,&allset);
 FD_SET(STDIN_FILENO,&allset);
 listen(sockfd,5);  
 initialisebrigetable(bridgetable);
 intialiseClientlist(clients);
 fprintf(stderr,"bridge:");
 for(;;)
 {
  resset=allset;
  select(maxfd+1,&resset,NULL,NULL,NULL);
  /*If the listening socket is active then accept the client*/
  if (FD_ISSET(sockfd,&resset))
  {
    memset(&recv_addr,'0',sizeof(recv_addr));
    len=sizeof(recv_addr);
    recv_sockfd=accept(sockfd,(struct sockaddr *)&recv_addr,(socklen_t *)&len);
    if (recv_sockfd<0)
    {
     perror("Accept:");
     continue;
    }
    if (acceptclient(clients,recv_sockfd))
    {
      if (recv_sockfd>maxfd)
      {
       maxfd=recv_sockfd;
      }
     fprintf(stderr,"Accepted clients\n");
     FD_SET(recv_sockfd,&allset);
     write(recv_sockfd,token_accept,sizeof(token_accept));
    }
    else
    {
     fprintf(stderr,"No free ports are available\n");
     write(recv_sockfd,token_reject,sizeof(token_reject));
     close(recv_sockfd);
    }
    
  }
 
  /*If the client socket is active*/
  for(counter=0;counter<no_ports;counter++)
  {
   if (FD_ISSET(clients[counter],&resset))
   {
    receiveforwardpkt(clients[counter],counter,bridgetable,clients,&allset);   
   }
  }

  /*If stdin is active*/
  if (FD_ISSET(STDIN_FILENO,&resset))
  {
   /*Every time make it Null for each line in command prompt*/
    read_line=NULL;
    command_arguments=NULL;
    read_line=read_command();
    if (read_line!=NULL)
    {
      command_arguments=get_commandarguments(read_line);
      if (strcmp(command_arguments[0],token_table)==0)
      {
       displaytableinfo(bridgetable);
      }
    }
    fprintf(stderr,"Tring to free the memory for command prompt\n");
    if (read_line!=NULL)
    {
     free(read_line);
     free(command_arguments);
    }
    fprintf(stderr,"Able to free the memory for command prompt\n");
  }
   removestaleentries(bridgetable);
 }


}
Exemple #2
0
int main(int argc, char *argv[])
{
  socket_t servsock;
  int maxfd;
  fd_set readfds;
  fd_set writefds;
  struct timeval seltimeout;
  int running = 1;

  /* initially we support only one client */
  socket_t clientsock = SOCKET_BAD;

  (void)argc;
  (void)argv;

  /* Create port socket */
  servsock = createserver(SERVER_PORT);

  /* Initialize maxfd for use by select() */
  maxfd = servsock;

  while (running) {
    int rc;
    FD_ZERO(&readfds);
    FD_ZERO(&writefds);
    FD_SET(STDIN_FILENO, &readfds);

    /* right now we only allow one client to connect, so when there's a client
       we don't listen for new connects */
    if (SOCKET_BAD != clientsock) {
      FD_SET(clientsock, &readfds);

      /* if there is anything to write, wait to send */
      FD_SET(clientsock, &writefds);
    }
    else
      FD_SET(servsock, &readfds);

    seltimeout.tv_sec =  TIMEOUT_SECS;
    seltimeout.tv_usec = 0;

    rc = select(maxfd + 1, &readfds, &writefds, NULL, &seltimeout);
    if (!rc)
      errorout("timeout expired!\n");
    else {
      if (FD_ISSET(STDIN_FILENO, &readfds)) {
        /* read stdin and pass as data to clients */
      }

      if (clientsock > 0) {
        if (FD_ISSET(clientsock, &readfds)) {
          /* client is readable */
          if (handleclient(&cl) < 0) {
            sclose(clientsock);
            clientsock = SOCKET_BAD;
          }
        }
        if (FD_ISSET(clientsock, &writefds)) {
          /* client is writeable */
        }
      }

      if (FD_ISSET(servsock, &readfds)) {
        printf("New client connects on port %d - assume fine TLS-NPN",
               SERVER_PORT);
        clientsock = acceptclient(servsock);

        /* create a spindly handle for the physical connection */
        cl.phys_server = spindly_phys_init(SPINDLY_SIDE_SERVER,
                                           SPINDLY_DEFAULT, NULL);
        cl.sock = clientsock; /* store the socket */
        maxfd = clientsock;
      }
    }
  }

  /* Close server socket */
  sclose(servsock);

  exit(0);
}