474 | | int StartShell(int port,Utility * uList[], Parameter * pList[], Observable * oList[], CE_Info * ce_info) { |
475 | | // Start socket server |
476 | | int sockfd, newsockfd, clilen; |
477 | | struct sockaddr_in serv_addr, cli_addr; |
478 | | char str[20]; |
479 | | |
480 | | // Setup server socket connection |
481 | | sockfd = socket(AF_INET, SOCK_STREAM, 0); |
482 | | if (sockfd < 0) |
483 | | error("ERROR opening socket"); |
484 | | bzero((char *) &serv_addr, sizeof(serv_addr)); |
485 | | serv_addr.sin_family = AF_INET; |
486 | | serv_addr.sin_port = htons(port); |
487 | | serv_addr.sin_addr.s_addr = INADDR_ANY; |
488 | | if (bind(sockfd, (struct sockaddr *) &serv_addr, |
489 | | sizeof(serv_addr)) < 0) |
490 | | error("ERROR on binding"); |
491 | | listen(sockfd,5); |
492 | | clilen = sizeof(cli_addr); |
493 | | |
494 | | //while(1) { |
495 | | newsockfd = accept(sockfd, |
496 | | (struct sockaddr *) &cli_addr, |
497 | | (socklen_t*)&clilen); |
498 | | if (newsockfd < 0) |
499 | | error("ERROR on accept"); |
500 | | |
501 | | inet_ntop(AF_INET,&(cli_addr.sin_addr),str,20); |
502 | | printf("Received a connection from a Cognitive Engine with IP address: %s\n\n",str); |
503 | | |
504 | | // Begin parsing the messages |
505 | | StartMessaging(newsockfd, uList, pList, oList, ce_info); |
506 | | //} |
| 545 | int AcceptTCPConnection(int servSock) |
| 546 | { |
| 547 | int clntSock; /* Socket descriptor for client */ |
| 548 | struct sockaddr_in echoClntAddr; |
| 549 | unsigned int clntLen; |
| 550 | |
| 551 | /* Set the size of the in-out parameter */ |
| 552 | clntLen = sizeof(echoClntAddr); |
| 553 | |
| 554 | /* Wait for a client to connect */ |
| 555 | //if ((clntSock = accept(servSock, (struct sockaddr *) &echoClntAddr, &clntLen)) < 0) { |
| 556 | if ((clntSock = accept(servSock, NULL, NULL)) < 0) { |
| 557 | return -1; |
| 558 | } |
| 559 | |
| 560 | /* clntSock is connected to a client! */ |
| 561 | |
| 562 | printf("Handling client %s\n", inet_ntoa(echoClntAddr.sin_addr)); |
| 563 | |
| 564 | return clntSock; |
| 565 | } |
| 566 | |
| 567 | int CreateTCPServerSocket(unsigned short port) |
| 568 | { |
| 569 | int sock; /* socket to create */ |
| 570 | struct sockaddr_in echoServAddr; /* Local address */ |
| 571 | |
| 572 | /* Create socket for incoming connections */ |
| 573 | if ((sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) |
| 574 | DieWithError("socket() failed"); |
| 575 | |
| 576 | /* Construct local address structure */ |
| 577 | memset(&echoServAddr, 0, sizeof(echoServAddr)); /* Zero out structure */ |
| 578 | echoServAddr.sin_family = AF_INET; /* Internet address family */ |
| 579 | echoServAddr.sin_addr.s_addr = htonl(INADDR_ANY); /* Any incoming interface */ |
| 580 | echoServAddr.sin_port = htons(port); /* Local port */ |
| 581 | |
| 582 | /* Bind to the local address */ |
| 583 | if (bind(sock, (struct sockaddr *) &echoServAddr, sizeof(echoServAddr)) < 0) |
| 584 | DieWithError("bind() failed"); |
| 585 | |
| 586 | /* Mark the socket so it will listen for incoming connections */ |
| 587 | if (listen(sock, 5) < 0) { |
| 588 | printf("listen() failed\n"); |
| 589 | return 0; |
| 590 | } |
| 591 | |
| 592 | return sock; |
| 593 | } |
| 594 | |
| 595 | void HandleTCPClient(int socketfd, Utility * uList[], Parameter * pList[], Observable * oList[], CE_Info * ce_info) |
| 596 | { |
| 597 | char buffer[256]; /* Buffer for echo string */ |
| 598 | |
| 599 | /* Receive message from client */ |
| 600 | bzero(buffer,256); |
| 601 | ReceiveMessage(socketfd,buffer); |
| 602 | |
| 603 | printf("Cognitive Radio:: Message Received - %s.\n\n", buffer); |
| 604 | |
| 605 | if(strcmp(buffer,"c_register") == 0) |
| 606 | InitializeCE(socketfd, uList, pList, oList, ce_info); |
| 607 | |
| 608 | if(strcmp(buffer,"p_register") == 0) |
| 609 | InitializePE(socketfd, ce_info); |
| 610 | |
| 611 | if(strcmp(buffer,"optimize") == 0) |
| 612 | RunSimulator(socketfd, uList, pList, oList, ce_info); |
| 613 | |
| 614 | //close(socketfd); /* Close client socket */ |
| 615 | } |
| 616 | |
| 617 | int StartServers(Utility * uList[], Parameter * pList[], Observable * oList[], CE_Info * ce_info) { |
| 618 | int * servSock; |
| 619 | int running = 1; |
| 620 | struct timeval selTimeout; |
| 621 | int timeout = 10; |
| 622 | int cognitive_engine = 0; |
| 623 | int policy_engine = 1; |
| 624 | int port, rc, on = 1; |
| 625 | int new_sd; |
| 626 | int desc_ready = 0; |
| 627 | fd_set sockSet; |
| 628 | |
| 629 | servSock = (int *) malloc(2 * sizeof(int)); |
| 630 | |
| 631 | servSock[cognitive_engine] = CreateTCPServerSocket(CE_SERVER_PORT); |
| 632 | servSock[policy_engine] = CreateTCPServerSocket(POLICY_SERVER_PORT); |
| 633 | |
| 634 | |
| 635 | int maxDescriptor = servSock[cognitive_engine]; |
| 636 | |
| 637 | if(servSock[cognitive_engine] < servSock[policy_engine]) |
| 638 | maxDescriptor = servSock[policy_engine]; |
| 639 | |
| 640 | rc = setsockopt(servSock[cognitive_engine], SOL_SOCKET, SO_REUSEADDR, (char*)&on, sizeof(on)); |
| 641 | if(rc < 0) |
| 642 | { |
| 643 | perror("setsockopt() failed"); |
| 644 | close(servSock[cognitive_engine]); |
| 645 | exit(-1); |
| 646 | } |
| 647 | |
| 648 | rc = setsockopt(servSock[policy_engine], SOL_SOCKET, SO_REUSEADDR, (char*)&on, sizeof(on)); |
| 649 | if(rc < 0) |
| 650 | { |
| 651 | perror("setsockopt() failed"); |
| 652 | close(servSock[policy_engine]); |
| 653 | exit(-1); |
| 654 | } |
| 655 | |
| 656 | rc = ioctl(servSock[cognitive_engine], FIONBIO, (char*)&on); |
| 657 | if(rc < 0) |
| 658 | { |
| 659 | perror("ioctl() failed"); |
| 660 | close(servSock[cognitive_engine]); |
| 661 | exit(-1); |
| 662 | } |
| 663 | |
| 664 | rc = ioctl(servSock[policy_engine], FIONBIO, (char*)&on); |
| 665 | if(rc < 0) |
| 666 | { |
| 667 | perror("ioctl() failed"); |
| 668 | close(servSock[policy_engine]); |
| 669 | exit(-1); |
| 670 | } |
| 671 | |
| 672 | printf("Starting server: Hit return to shutdown\n"); |
| 673 | while (running) |
| 674 | { |
| 675 | /* Zero socket descriptor vector and set for server sockets */ |
| 676 | /* This must be reset every time select() is called */ |
| 677 | FD_ZERO(&sockSet); |
| 678 | /* Add keyboard to descriptor vector */ |
| 679 | FD_SET(STDIN_FILENO, &sockSet); |
| 680 | FD_SET(servSock[cognitive_engine], &sockSet); |
| 681 | FD_SET(servSock[policy_engine], &sockSet); |
| 682 | |
| 683 | /* Timeout specification */ |
| 684 | /* This must be reset every time select() is called */ |
| 685 | selTimeout.tv_sec = timeout; /* timeout (secs.) */ |
| 686 | selTimeout.tv_usec = 0; /* 0 microseconds */ |
| 687 | |
| 688 | /* Suspend program until descriptor is ready or timeout */ |
| 689 | rc = select(maxDescriptor + 1, &sockSet, NULL, NULL, &selTimeout); |
| 690 | if (rc == 0) |
| 691 | printf("No echo requests for %i secs...Server still alive\n", timeout); |
| 692 | else |
| 693 | { |
| 694 | if (FD_ISSET(0, &sockSet)) /* Check keyboard */ |
| 695 | { |
| 696 | printf("Shutting down server\n"); |
| 697 | getchar(); |
| 698 | running = 0; |
| 699 | } |
| 700 | |
| 701 | desc_ready = rc; |
| 702 | |
| 703 | for (port = 0; port <= maxDescriptor && desc_ready > 0; port++) { |
| 704 | if (FD_ISSET(port, &sockSet)) |
| 705 | { |
| 706 | printf("Request on port %d: ", port); |
| 707 | desc_ready -= 1; |
| 708 | |
| 709 | |
| 710 | if( (port == servSock[cognitive_engine]) || (port == servSock[policy_engine])) { |
| 711 | |
| 712 | do |
| 713 | { |
| 714 | new_sd = AcceptTCPConnection(port); |
| 715 | if(new_sd < 0) |
| 716 | { |
| 717 | break; |
| 718 | } |
| 719 | |
| 720 | HandleTCPClient(new_sd, uList, pList, oList, ce_info); |
| 721 | FD_SET(new_sd,&sockSet); |
| 722 | if(new_sd > maxDescriptor) |
| 723 | maxDescriptor = new_sd; |
| 724 | printf("New incoming connection - %i\n\n",new_sd); |
| 725 | } while(new_sd != -1); |
| 726 | } else { |
| 727 | |
| 728 | printf("Request on already open descriptor.\n\n"); |
| 729 | HandleTCPClient(port, uList, pList, oList, ce_info); |
| 730 | |
| 731 | } |
| 732 | |
| 733 | } |
| 734 | } |
| 735 | } |
| 736 | } |
| 737 | |
| 738 | /* Close sockets */ |
| 739 | for (port = 0; port < 2; port++) |
| 740 | close(servSock[port]); |
| 741 | |
| 742 | /* Free list of sockets */ |
| 743 | free(servSock); |
| 744 | |