Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <fcntl.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <unistd.h>
- #include <string.h>
- #include <sys/types.h>
- #include <sys/socket.h>
- #include <netinet/in.h>
- #include <netdb.h>
- #include <errno.h>
- #include <sys/wait.h>
- #define POWER 1
- #define ENGINE 2
- #define FORWARD 4
- #define TURN 8
- #define LEFTRIGHT 16
- #define LIGHTS 32
- #define PROX 64
- #define UNKNOWN 128
- #define MAXDATASIZE 1024
- //#define PONIEIP "192.168.1.20"
- #define PONIEIP "192.168.1.200"
- //#define PONIEIP "10.0.2.15"
- #define PONIEPORT 4500
- #define SERVERPORT 4501
- int pipes[2];
- char sendbits;
- int sockfd;
- int newsockfd;
- char* substring(const char* str, size_t begin, size_t len) {
- if (str == 0 || strlen(str) == 0 || strlen(str) < begin || strlen(str) < (begin+len))
- return 0;
- return strndup(str + begin, len);
- }
- void error(const char *msg) {
- perror(msg);
- exit(0);
- }
- const char *byte_to_binary (int x) {
- static char b[9];
- b[0] = '\0';
- int z;
- for (z = 128; z > 0; z >>= 1)
- {
- strcat(b, ((x & z) == z) ? "1" : "0");
- }
- return b;
- }
- void setbit(int bittoset) {
- sendbits = sendbits | bittoset;
- }
- void unsetbit(int bittounset) {
- sendbits = sendbits & ~bittounset;
- }
- //int main(int argc, char *argv[])
- int start_client(void)
- {
- int portno, n, nbytes;
- struct sockaddr_in serv_addr;
- struct hostent *server;
- bool send = false;
- char sendbuffer[1];
- char recvbuffer[4];
- sockfd = socket(AF_INET, SOCK_STREAM, 0);
- if (sockfd < 0) {
- error("ERROR opening socket");
- } else {
- printf("Client says: Socket opened\n");
- fflush(stdout);
- }
- server = gethostbyname(PONIEIP);
- if (server == NULL) {
- fprintf(stderr,"ERROR, no such host\n");
- fflush(stdout);
- exit(0);
- } else {
- printf("Client says: Got host information\n");
- fflush(stdout);
- }
- bzero((char *) &serv_addr, sizeof(serv_addr)); // Zero out the server address
- printf("Client says: Server info flushed\n");
- fflush(stdout);
- serv_addr.sin_family = AF_INET; // set the connection type to TCP
- printf("Client says: Connection type - TCP\n");
- fflush(stdout);
- bcopy((char *)server->h_addr, (char *)&serv_addr.sin_addr.s_addr, server->h_length); // copy the server address
- printf("Client says: Server info copied\n");
- fflush(stdout);
- serv_addr.sin_port = htons(PONIEPORT);
- printf("Client says: Server port set (%i)\n", PONIEPORT);
- fflush(stdout);
- if (connect(sockfd,(struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0) {
- error("ERROR connecting");
- } else {
- printf("Client says: Connection to PoNIE established\n");
- fflush(stdout);
- }
- setbit(POWER);
- int x;
- for (x = 1; x < 1000; x++) {
- nbytes = read(pipes[0], recvbuffer, sizeof(recvbuffer));
- if(nbytes == 4) {
- printf("< Client Received: \"%s\"\n",recvbuffer);
- fflush(stdout);
- //setbit(UNKNOWN);
- if(strcmp(recvbuffer, "FORW") == 0) {
- setbit(ENGINE + FORWARD);
- unsetbit(TURN);
- send = true;
- }
- if(strcmp(recvbuffer, "BAKW") == 0) {
- setbit(ENGINE);
- unsetbit(FORWARD + TURN);
- send = true;
- }
- if(strcmp(recvbuffer, "BAKL") == 0) {
- setbit(ENGINE + TURN + LEFTRIGHT);
- unsetbit(FORWARD);
- send = true;
- }
- if(strcmp(recvbuffer, "BAKR") == 0) {
- setbit(ENGINE + TURN);
- unsetbit(FORWARD + LEFTRIGHT);
- send = true;
- }
- if(strcmp(recvbuffer, "FORR") == 0) {
- setbit(FORWARD + ENGINE + TURN);
- unsetbit(LEFTRIGHT);
- send = true;
- }
- if(strcmp(recvbuffer, "FORL") == 0) {
- setbit(FORWARD + ENGINE + TURN + LEFTRIGHT);
- send = true;
- }
- if(strcmp(recvbuffer, "PROF") == 0) {
- unsetbit(POWER + FORWARD + ENGINE + TURN + LEFTRIGHT + PROX + LIGHTS);
- send = true;
- }
- if(strcmp(recvbuffer, "PRON") == 0) {
- setbit(POWER);
- send = true;
- }
- if(strcmp(recvbuffer, "STOP") == 0) {
- unsetbit(FORWARD + ENGINE + TURN + LEFTRIGHT);
- send = true;
- }
- if(strcmp(recvbuffer, "LGON") == 0) {
- setbit(LIGHTS);
- send = true;
- }
- if(strcmp(recvbuffer, "LGOF") == 0) {
- unsetbit(LIGHTS);
- send = true;
- }
- if(send == true) {
- printf("> Client Sending: %s\n", byte_to_binary(sendbits));
- fflush(stdout);
- send = false;
- sendbuffer[0] = sendbits;
- n = write(sockfd,sendbuffer,1);
- if (n < 0) error("ERROR writing to socket");
- }
- }
- sleep(1);
- bzero(recvbuffer,5); // Clear the buffer
- }
- n = read(sockfd,recvbuffer,16);
- if (n < 0) error("ERROR reading from socket");
- return 0;
- }
- int start_server(void)
- {
- int newsockfd, portno;
- socklen_t clilen;
- char buffer[16];
- char outbuffer[444];
- int i;
- struct sockaddr_in serv_addr, cli_addr;
- int n;
- sockfd = socket(AF_INET, SOCK_STREAM, 0);
- if (sockfd < 0)
- error("ERROR opening socket");
- bzero((char *) &serv_addr, sizeof(serv_addr));
- portno = SERVERPORT;
- serv_addr.sin_family = AF_INET;
- serv_addr.sin_addr.s_addr = INADDR_ANY;
- serv_addr.sin_port = htons(portno);
- if (bind(sockfd, (struct sockaddr *) &serv_addr,
- sizeof(serv_addr)) < 0)
- error("ERROR on binding");
- listen(sockfd,5);
- clilen = sizeof(cli_addr);
- for(int i = 0; i < 10000; i++) {
- newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
- if (newsockfd < 0)
- error("ERROR on accept");
- while(n = read(newsockfd,buffer,15)) {
- if (n < 0) error("ERROR reading from socket");
- //for (i = 0; i < 4 ; i++) { outbuffer[i] = buffer[i]; }
- strncpy(outbuffer, buffer, 4);
- //outbuffer[4] = '\0';
- i=0;
- printf("%s << ", outbuffer);
- write(pipes[1], outbuffer, (strlen(outbuffer) + 1));
- bzero(buffer,16);
- bzero(outbuffer,4);
- }
- close(newsockfd);
- }
- close(sockfd);
- return 0;
- }
- int main(int argc, char** argv) {
- int childpid;
- if(pipe2(pipes, O_NONBLOCK) < 0) {
- perror("Pipe allocation failed");
- exit(0);
- }
- switch(childpid=fork()){
- case -1:
- perror("Problem with fork\n");
- break;
- case 0: //Child
- start_server();
- break;
- default: //Parent
- start_client();
- waitpid(childpid,0,0);
- break;
- }
- }
- void onExit( void )
- {
- printf("Cleaning up");
- close(sockfd);
- close(newsockfd);
- }
Add Comment
Please, Sign In to add comment