daily pastebin goal
44%
SHARE
TWEET

Untitled

a guest May 16th, 2018 87 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <fcntl.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <unistd.h>
  5. #include <string.h>
  6. #include <sys/types.h>
  7. #include <sys/socket.h>
  8. #include <netinet/in.h>
  9. #include <netdb.h>
  10. #include <errno.h>
  11. #include <sys/wait.h>
  12.              
  13.  
  14.  
  15. #define POWER 1
  16. #define ENGINE 2
  17. #define FORWARD 4
  18. #define TURN 8
  19. #define LEFTRIGHT 16
  20. #define LIGHTS 32
  21. #define PROX 64
  22. #define UNKNOWN 128
  23.  
  24. #define MAXDATASIZE 1024
  25.  
  26. //#define PONIEIP "192.168.1.20"
  27. #define PONIEIP "192.168.1.200"
  28. //#define PONIEIP "10.0.2.15"
  29. #define PONIEPORT 4500
  30. #define SERVERPORT 4501
  31.  
  32. int pipes[2];
  33. char sendbits;
  34. int sockfd;
  35. int newsockfd;
  36.  
  37. char* substring(const char* str, size_t begin, size_t len) {
  38.   if (str == 0 || strlen(str) == 0 || strlen(str) < begin || strlen(str) < (begin+len))
  39.     return 0;
  40.  
  41.   return strndup(str + begin, len);
  42. }
  43. void error(const char *msg) {
  44.     perror(msg);
  45.     exit(0);
  46. }
  47. const char *byte_to_binary (int x) {
  48.     static char b[9];
  49.     b[0] = '\0';
  50.  
  51.     int z;
  52.     for (z = 128; z > 0; z >>= 1)
  53.     {
  54.         strcat(b, ((x & z) == z) ? "1" : "0");
  55.     }
  56.  
  57.     return b;
  58. }
  59. void setbit(int bittoset) {
  60.   sendbits = sendbits | bittoset;
  61. }  
  62. void unsetbit(int bittounset) {
  63.   sendbits = sendbits & ~bittounset;
  64. }
  65.  
  66.  
  67.  
  68.  
  69.  
  70.  
  71.  
  72.  
  73.  
  74.  
  75.  
  76.  
  77.  
  78. //int main(int argc, char *argv[])
  79. int start_client(void)
  80. {
  81.  
  82.     int portno, n, nbytes;
  83.     struct sockaddr_in serv_addr;
  84.     struct hostent *server;
  85.     bool send = false;
  86.    
  87.     char sendbuffer[1];
  88.     char recvbuffer[4];
  89.    
  90.     sockfd = socket(AF_INET, SOCK_STREAM, 0);
  91.     if (sockfd < 0) {
  92.         error("ERROR opening socket");
  93.     } else {
  94.     printf("Client says:  Socket opened\n");
  95.     fflush(stdout);
  96.     }
  97.  
  98.     server = gethostbyname(PONIEIP);
  99.    
  100.     if (server == NULL) {
  101.         fprintf(stderr,"ERROR, no such host\n");
  102.     fflush(stdout);
  103.         exit(0);
  104.     } else {
  105.     printf("Client says:  Got host information\n");
  106.     fflush(stdout);
  107.     }
  108.  
  109.     bzero((char *) &serv_addr, sizeof(serv_addr));  //  Zero out the server address
  110.     printf("Client says:  Server info flushed\n");
  111.     fflush(stdout);
  112.    
  113.     serv_addr.sin_family = AF_INET;  // set the connection type to TCP
  114.     printf("Client says:  Connection type - TCP\n");
  115.     fflush(stdout);
  116.    
  117.     bcopy((char *)server->h_addr, (char *)&serv_addr.sin_addr.s_addr, server->h_length);  // copy the server address
  118.     printf("Client says:  Server info copied\n");
  119.     fflush(stdout);
  120.    
  121.     serv_addr.sin_port = htons(PONIEPORT);
  122.     printf("Client says:  Server port set (%i)\n", PONIEPORT);
  123.     fflush(stdout);
  124.    
  125.     if (connect(sockfd,(struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0) {
  126.         error("ERROR connecting");
  127.     } else {
  128.     printf("Client says:  Connection to PoNIE established\n");
  129.     fflush(stdout);
  130.     }
  131.    
  132.     setbit(POWER);
  133.    
  134.     int x;
  135.     for (x = 1; x < 1000; x++) {
  136.       nbytes = read(pipes[0], recvbuffer, sizeof(recvbuffer));
  137.  
  138.       if(nbytes == 4) {
  139.    
  140.     printf("< Client Received: \"%s\"\n",recvbuffer);
  141.     fflush(stdout);
  142.    
  143.     //setbit(UNKNOWN);
  144.     if(strcmp(recvbuffer, "FORW") == 0) {
  145.       setbit(ENGINE + FORWARD);
  146.       unsetbit(TURN);
  147.       send = true;
  148.     }
  149.    
  150.     if(strcmp(recvbuffer, "BAKW") == 0) {
  151.       setbit(ENGINE);
  152.       unsetbit(FORWARD + TURN);
  153.       send = true;
  154.     }
  155.    
  156.     if(strcmp(recvbuffer, "BAKL") == 0) {
  157.       setbit(ENGINE + TURN + LEFTRIGHT);
  158.       unsetbit(FORWARD);
  159.       send = true;
  160.     }
  161.    
  162.     if(strcmp(recvbuffer, "BAKR") == 0) {
  163.       setbit(ENGINE + TURN);
  164.       unsetbit(FORWARD + LEFTRIGHT);
  165.       send = true;
  166.     }
  167.    
  168.     if(strcmp(recvbuffer, "FORR") == 0) {
  169.       setbit(FORWARD + ENGINE + TURN);
  170.       unsetbit(LEFTRIGHT);
  171.       send = true;
  172.     }
  173.  
  174.     if(strcmp(recvbuffer, "FORL") == 0) {
  175.       setbit(FORWARD + ENGINE + TURN + LEFTRIGHT);
  176.       send = true;
  177.     }
  178.    
  179.     if(strcmp(recvbuffer, "PROF") == 0) {
  180.       unsetbit(POWER + FORWARD + ENGINE + TURN + LEFTRIGHT + PROX + LIGHTS);
  181.       send = true;
  182.     }
  183.    
  184.     if(strcmp(recvbuffer, "PRON") == 0) {
  185.       setbit(POWER);
  186.       send = true;
  187.     }
  188.    
  189.     if(strcmp(recvbuffer, "STOP") == 0) {
  190.       unsetbit(FORWARD + ENGINE + TURN + LEFTRIGHT);
  191.       send = true;
  192.     }
  193.    
  194.     if(strcmp(recvbuffer, "LGON") == 0) {
  195.       setbit(LIGHTS);
  196.       send = true;
  197.     }
  198.    
  199.     if(strcmp(recvbuffer, "LGOF") == 0) {
  200.       unsetbit(LIGHTS);
  201.       send = true;
  202.     }  
  203.    
  204.     if(send == true) {
  205.       printf("> Client Sending: %s\n", byte_to_binary(sendbits));
  206.       fflush(stdout);
  207.       send = false;
  208.      
  209.       sendbuffer[0] = sendbits;
  210.       n = write(sockfd,sendbuffer,1);
  211.       if (n < 0) error("ERROR writing to socket");
  212.     }
  213.       }
  214.      
  215.      
  216.  
  217.      
  218.       sleep(1);
  219.       bzero(recvbuffer,5);  //  Clear the buffer
  220.     }
  221.  
  222.     n = read(sockfd,recvbuffer,16);
  223.     if (n < 0) error("ERROR reading from socket");
  224.    
  225.     return 0;
  226.    
  227.    
  228. }
  229.  
  230.  
  231.  
  232.  
  233.  
  234.  
  235.  
  236.  
  237.  
  238.  
  239.  
  240.  
  241.  
  242.  
  243.  
  244.  
  245.  
  246.  
  247.  
  248.  
  249.  
  250.  
  251.  
  252. int start_server(void)
  253. {
  254.      int newsockfd, portno;
  255.      socklen_t clilen;
  256.      char buffer[16];
  257.      char outbuffer[444];
  258.      int i;
  259.      
  260.      struct sockaddr_in serv_addr, cli_addr;
  261.      int n;
  262.  
  263.      sockfd = socket(AF_INET, SOCK_STREAM, 0);
  264.      if (sockfd < 0)
  265.         error("ERROR opening socket");
  266.      bzero((char *) &serv_addr, sizeof(serv_addr));
  267.      portno = SERVERPORT;
  268.      
  269.      serv_addr.sin_family = AF_INET;
  270.      serv_addr.sin_addr.s_addr = INADDR_ANY;
  271.      serv_addr.sin_port = htons(portno);
  272.      if (bind(sockfd, (struct sockaddr *) &serv_addr,
  273.               sizeof(serv_addr)) < 0)
  274.               error("ERROR on binding");
  275.  
  276.      listen(sockfd,5);
  277.      clilen = sizeof(cli_addr);
  278.  
  279.  
  280.  
  281.      for(int i = 0; i < 10000; i++) {
  282.     newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
  283.     if (newsockfd < 0)
  284.         error("ERROR on accept");
  285.    
  286.     while(n = read(newsockfd,buffer,15)) {
  287.         if (n < 0) error("ERROR reading from socket");
  288.  
  289.         //for (i = 0; i < 4 ; i++) { outbuffer[i] = buffer[i]; }
  290.         strncpy(outbuffer, buffer, 4);
  291.         //outbuffer[4] = '\0';
  292.         i=0;
  293.        
  294.         printf("%s << ", outbuffer);
  295.         write(pipes[1], outbuffer, (strlen(outbuffer) + 1));
  296.        
  297.         bzero(buffer,16);
  298.         bzero(outbuffer,4);
  299.     }
  300.      
  301.     close(newsockfd);
  302.      }
  303.      close(sockfd);
  304.      return 0;
  305. }
  306.  
  307.  
  308.  
  309.  
  310.  
  311.  
  312.  
  313.  
  314.  
  315.  
  316. int main(int argc, char** argv) {
  317.  
  318.     int childpid;
  319.  
  320.      if(pipe2(pipes, O_NONBLOCK) < 0) {
  321.           perror("Pipe allocation failed");
  322.          exit(0);
  323.       }
  324.  
  325.      switch(childpid=fork()){
  326.          case -1:
  327.              perror("Problem with fork\n");
  328.              break;
  329.  
  330.          case 0:  //Child
  331.         start_server();
  332.             break;
  333.        
  334.          default: //Parent
  335.         start_client();
  336.             waitpid(childpid,0,0);
  337.             break;
  338.      }
  339.  
  340.  
  341.  
  342. }
  343.  
  344.  
  345.  
  346.  
  347.  
  348. void onExit( void )
  349. {
  350.     printf("Cleaning up");
  351.     close(sockfd);
  352.     close(newsockfd);
  353. }
RAW Paste Data
Top