Guest User

Untitled

a guest
May 16th, 2018
120
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.71 KB | None | 0 0
  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. }
Add Comment
Please, Sign In to add comment