/*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); } }
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); }