Skip to content

Instantly share code, notes, and snippets.

@MatanTubul
Created January 22, 2015 09:53
Show Gist options
  • Select an option

  • Save MatanTubul/323376d0d21ca2e05ade to your computer and use it in GitHub Desktop.

Select an option

Save MatanTubul/323376d0d21ca2e05ade to your computer and use it in GitHub Desktop.

Revisions

  1. MatanTubul created this gist Jan 22, 2015.
    85 changes: 85 additions & 0 deletions brdcat.c
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,85 @@
    /*
    Client server Developed By Matan Tubul
    */
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <unistd.h>
    #include <sys/wait.h>
    #include "brd.h"
    #include <sys/shm.h>
    #include <fcntl.h>
    #include <string.h>
    #include <sys/socket.h>
    #include <stdint.h>
    #include <arpa/inet.h>
    #include <sys/socket.h>
    #include <linux/filter.h>
    #include <netinet/in.h>
    #define MYSERVER "127.0.0.1"

    void failure (char *msg);
    void printMsg(msg_ent_t s);

    int main(int argc,char *argv[])
    {
    int sd,i;
    struct sockaddr_in clientaddr;
    msg_ok_t reply;
    msg_cat_t msg_cat;
    msg_cnt_t msg_cnt;
    msg_ent_t msgFromSrvr;

    if(argc < 2)
    {
    printf("few arguments!\n");
    exit(EXIT_FAILURE);
    }

    if((sd = socket(AF_INET,SOCK_STREAM,0)) < 0)
    failure("Client socket:");
    printf("Connecting to Server %s\n",MYSERVER);
    // converitng the ip address and the struct into the correct type
    clientaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
    clientaddr.sin_family = AF_INET;
    clientaddr.sin_port = htons(B_PORT_NUM);
    if (inet_aton(MYSERVER , &clientaddr.sin_addr) == 0)
    failure("inet_aton() failed\n");
    //connect to server
    if((connect(sd, (struct sockaddr *)&clientaddr, sizeof(clientaddr))) < 0 )
    failure("Connect failed:");
    puts("Connected\n;");
    strcpy(msg_cat.m_cat,argv[1]);
    msg_cat.m_type = B_TYPE_CAT;

    //sending message of type msg_cat_t
    if(send(sd,(char *) &msg_cat ,sizeof(msg_cat) , 0 ) < 0)
    failure("Send failed");
    //reciving message from type msg_cnt_t
    if(recv(sd,(char *)&msg_cnt,sizeof(msg_cnt),0) < 0)
    failure("recv failed:");
    printf("%d\n",msg_cnt.m_count);

    for(i=0;i<msg_cnt.m_count; i++)
    {
    sleep(1);
    if(recv(sd,(char *)&msgFromSrvr,sizeof(msgFromSrvr),0) < 0)
    failure("recv failed:");
    printMsg(msgFromSrvr);
    }
    if (close(sd) < 0)
    failure("close");

    }
    void failure (char *msg)
    {
    perror(msg);
    exit(EXIT_FAILURE);
    }
    void printMsg(msg_ent_t s)
    {
    printf("%d/%d/%d",s.m_entry.b_date.day,s.m_entry.b_date.month,s.m_entry.b_date.year);
    printf(" ");
    printf("%s",s.m_entry.b_category);
    printf("%s\n",s.m_entry.b_text);
    }
    98 changes: 98 additions & 0 deletions brddate.c
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,98 @@
    /*
    Client server Developed By Nir Bercovitz
    */
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <unistd.h>
    #include <sys/wait.h>
    #include "brd.h"
    #include <sys/shm.h>
    #include <fcntl.h>
    #include <string.h>
    #include <sys/socket.h>
    #include <stdint.h>
    #include <arpa/inet.h>
    #include <sys/socket.h>
    #include <linux/filter.h>
    #include <netinet/in.h>
    #define MYSERVER "127.0.0.1"

    void failure (char *msg);
    void printMsg(msg_ent_t s);


    int main(int argc,char *argv[])
    {
    int sd,i;
    struct sockaddr_in clientaddr;
    msg_date_t msg_date;
    msg_cnt_t msg_cnt;
    msg_ent_t msgFromSrvr;

    if(argc < 2)
    {
    printf("few arguments!\n");
    exit(EXIT_FAILURE);
    }

    // open a socket
    if((sd = socket(AF_INET,SOCK_STREAM,0)) < 0)
    failure("Client socket:");
    printf("Connecting to Server %s\n",MYSERVER);

    // converitng the ip address and the struct into the correct type
    clientaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
    clientaddr.sin_family = AF_INET;
    clientaddr.sin_port = htons(B_PORT_NUM);
    if (inet_aton(MYSERVER , &clientaddr.sin_addr) == 0)
    failure("inet_aton() failed\n");

    //connect to server
    if((connect(sd, (struct sockaddr *)&clientaddr, sizeof(clientaddr))) < 0 )
    failure("Connect failed:");
    puts("Connected\n;");

    //filling fields of msg type date
    char * sptr = NULL;
    msg_date.m_start.day = atoi(strtok_r(argv[1],"/\n",&sptr));
    msg_date.m_start.month = atoi(strtok_r(NULL,"/\n",&sptr));
    msg_date.m_start.year = atoi(strtok_r(NULL,"/\n",&sptr));
    msg_date.m_type = B_TYPE_DATE;

    //sending message of type msg_date_t
    if(send(sd,(char *) &msg_date ,sizeof(msg_date) , 0 ) < 0)
    failure("Send failed");

    //reciving message from type msg_date_t
    if(recv(sd,(char *)&msg_cnt,sizeof(msg_cnt),0) < 0)
    failure("recv failed:");


    for (i = 0 ; i < msg_cnt.m_count; i++ )
    {
    if(recv(sd,(char *)&msgFromSrvr,sizeof(msgFromSrvr),0) < 0)
    failure("recv failed:");
    printMsg(msgFromSrvr);
    }

    if (close(sd) < 0)
    failure("close");

    }
    void failure (char *msg)
    {
    perror(msg);
    exit(EXIT_FAILURE);
    }
    void printMsg(msg_ent_t s)
    {
    printf("%d/%d/%d",s.m_entry.b_date.day,s.m_entry.b_date.month,s.m_entry.b_date.year);
    printf(" ");
    printf("%s",s.m_entry.b_category);
    printf("%s\n",s.m_entry.b_text);
    }




    120 changes: 120 additions & 0 deletions brdent.c
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,120 @@
    /*
    Client server Developed By Matan Tubul
    */
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <unistd.h>
    #include <sys/wait.h>
    #include "brd.h"
    #include <sys/shm.h>
    #include <fcntl.h>
    #include <string.h>
    #include <sys/socket.h>
    #include <stdint.h>
    #include <arpa/inet.h>
    #include <sys/socket.h>
    #include <linux/filter.h>
    #include <netinet/in.h>
    #define MYSERVER "127.0.0.1"
    void printMsg(msg_ent_t s);
    void failure (char *msg);
    int main (int argc,char *argv[])
    {
    int boardMessagesFD, nread, lineInputIndex = 0,j,sd;
    char date[B_DATE_LEN], tempText[2], temp[B_TEXT_LEN];
    struct sockaddr_in clientaddr;
    board_ent_t boardEntry; // struct of board entry
    msg_ent_t msgToSrvr;// struct of message entity
    msg_ok_t reply;//struct of reply message


    //open a txt file
    if ((boardMessagesFD = open ("classified.txt", O_RDONLY, 0664)) == -1)
    failure("Open");
    while(1)
    {
    if ((nread = read (boardMessagesFD, date,B_DATE_LEN)) == -1)
    failure("read_date_1");
    else if (nread == 0) //check if you got to the end of the input txt file
    {
    lseek(boardMessagesFD, 0, SEEK_SET); //if so place the pointer to the file at the beginning and read again
    if ((nread = read(boardMessagesFD, date, B_DATE_LEN)) == -1)
    failure("read_date_2");
    }
    date[B_DATE_LEN] = '\0';
    char * sptr = NULL;
    boardEntry.b_date.day = atoi(strtok_r(date,"/\n",&sptr));
    boardEntry.b_date.month = atoi(strtok_r(NULL,"/\n",&sptr));
    boardEntry.b_date.year = atoi(strtok_r(NULL,"/\n",&sptr));
    if ((nread = read (boardMessagesFD, boardEntry.b_category ,B_CAT_LEN)) == -1)
    failure("read_category");
    boardEntry.b_category [B_CAT_LEN] = '\0';
    strcpy(boardEntry.b_text,"");

    // copy the free text into the struct text field.
    lineInputIndex = 0;
    j=0;
    do{
    if(j > B_TEXT_LEN)
    j=0;
    if ((nread = read (boardMessagesFD, tempText ,1)) == -1)
    failure("read_text");
    tempText[1] = '\0';
    lineInputIndex++;
    temp[j] = tempText[0];
    j++;
    } while ( strcmp(tempText,"\n") && nread !=0);
    temp[j]='\0';
    strcpy(boardEntry.b_text,temp);

    //put text into the right place
    boardEntry.b_text[lineInputIndex] = '\0';

    // open a socket
    if((sd = socket(AF_INET,SOCK_STREAM,0)) < 0)
    failure("Client socket:");
    printf("Connecting to Server %s\n",MYSERVER);
    // convert the details into the correct network
    clientaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
    clientaddr.sin_family = AF_INET;
    clientaddr.sin_port = htons(B_PORT_NUM);
    if (inet_aton(MYSERVER , &clientaddr.sin_addr) == 0)
    failure("inet_aton() failed\n");

    //connect to the server
    if((connect(sd, (struct sockaddr *)&clientaddr, sizeof(clientaddr))) < 0 )
    failure("Connect failed:");
    puts("Connected\n");
    // format msg_ent
    msgToSrvr.m_entry = boardEntry;
    msgToSrvr.m_type = B_TYPE_ENT;


    //send
    if(send(sd,(char *) &msgToSrvr ,sizeof(msgToSrvr) , 0 ) < 0)
    failure("Send failed");
    printMsg(msgToSrvr);
    //recv
    if(recv(sd,(char *)&reply,sizeof(reply),0) < 0)
    failure("recv failed:");
    printf("server answered : %d\n",reply.m_type);
    if (close(sd) < 0)
    failure("close");
    sleep(3);
    }//while

    }//main

    void failure (char *msg)
    {
    perror(msg);
    exit(EXIT_FAILURE);
    }
    void printMsg(msg_ent_t s)
    {
    printf("%d/%d/%d",s.m_entry.b_date.day,s.m_entry.b_date.month,s.m_entry.b_date.year);
    printf(" ");
    printf("%s",s.m_entry.b_category);
    printf("%s\n",s.m_entry.b_text);
    }
    226 changes: 226 additions & 0 deletions brdserv.c
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,226 @@
    /*
    Client server Developed By Nir Bercovitz
    */
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <unistd.h>
    #include <sys/wait.h>
    #include "brd.h"
    #include <sys/shm.h>
    #include <fcntl.h>
    #include <string.h>
    #include <sys/socket.h>
    #include <stdint.h>
    #include <arpa/inet.h>
    #include <sys/socket.h>
    #include <linux/filter.h>
    #include <netinet/in.h>
    #define MAX_CONNECTIONS 5

    void failure (char *msg);
    void printMsg(msg_ent_t s);
    int countThisCategory(char * category, board_ent_t* mainBoard, board_ent_t* specificRequest);
    int countThisDate(date_t date, board_ent_t* mainBoard, board_ent_t* specificRequest);
    void copyEntryDetails(board_ent_t * to, board_ent_t * from);
    board_ent_t specificRequest[B_ENT_CNT];
    int main (int argc,char *argv[])
    {
    int sock_fd, acpt_fd, messagesBoardIndex = 0, pid , i, typeOfMsg;
    board_ent_t mainBoard[B_ENT_CNT];

    struct sockaddr_in serverAddr, senderAddr;
    msg_ent_t msgEnt; //incoming msg type - post
    msg_cat_t msgCat; //incoming msg type - category
    msg_date_t msgDate; //incoming msg type - date

    msg_ok_t rplyOK; //reply msg type - OK
    msg_cnt_t rplyCNT; //reply msg type - count of a category in the board
    msg_ent_t rplyCat; //reply msg type - specific category posts in the board
    msg_ent_t rplyDate; //reply msg type - specific date posts in the board
    msg_ent_t temp;
    int slen = sizeof(senderAddr);

    //socket
    if((sock_fd = socket(AF_INET,SOCK_STREAM,0)) < 0)
    failure("Server socket");

    //bind
    serverAddr.sin_family = AF_INET;
    serverAddr.sin_port = htons(B_PORT_NUM);
    serverAddr.sin_addr.s_addr = INADDR_ANY;
    if (bind(sock_fd , (struct sockaddr *) &serverAddr , sizeof(serverAddr) ) < 0)
    failure("Bind failed");

    //listen
    if (listen(sock_fd , MAX_CONNECTIONS ) < 0 )
    failure("Listen failed");

    while(1) {
    //accept
    if ((acpt_fd = accept(sock_fd, (struct sockaddr *) &senderAddr, &slen)) < 0)
    failure("Accept failed");

    //peek
    if ((recv(acpt_fd, (char *) &typeOfMsg, sizeof(typeOfMsg), MSG_PEEK)) < 0)
    failure("Peek failed");

    if (typeOfMsg == B_TYPE_ENT) //check msg type
    {
    //recv
    if ((recv(acpt_fd, (char *) &msgEnt, sizeof(msgEnt),0 )) < 0)//get Msg and sender addr
    failure("ReceiveMsg failed");
    if (messagesBoardIndex == B_ENT_CNT) //check if you got to the end of the board array before filling it
    messagesBoardIndex = 0; //if so start filling the board array with messages from the beginning

    //calculate data - fill the details in the right place in the array
    copyEntryDetails(&mainBoard[messagesBoardIndex], &msgEnt.m_entry);

    messagesBoardIndex++;

    //send reply
    rplyOK.m_type = B_TYPE_OK;
    if ((sendto(acpt_fd, (char *) &rplyOK, sizeof(rplyOK), 0, (struct sockaddr *) &senderAddr, sizeof(senderAddr))) < 0) //send reply to sender
    failure("SendOKto failed");
    }//if
    else
    {
    //create son
    pid = fork();
    if (pid == 0) //this is our son
    {
    close(sock_fd);
    if (typeOfMsg == B_TYPE_CAT) //check msg type
    {
    //recv
    if ((recv(acpt_fd ,(char *) &msgCat ,sizeof(msgCat) ,0 )) < 0 )//get Msg and sender addr
    failure("Receivecat failed");

    //calculate category
    rplyCNT.m_type = B_TYPE_CNT ;
    rplyCNT.m_count = countThisCategory(msgCat.m_cat,mainBoard,specificRequest);
    //print which indicate the amount of message that should sent.
    printf("%d\n",rplyCNT.m_count);
    //send reply
    if ((send(acpt_fd ,(char *) &rplyCNT ,sizeof(rplyCNT) ,0)) < 0 ) //send reply to sender
    failure("SendCNTCat failed");
    //calculate
    rplyCat.m_type = B_TYPE_ENT;
    for(i=0;i<B_ENT_CNT;i++)
    {

    if((strncmp(mainBoard[i].b_category,msgCat.m_cat,strlen(msgCat.m_cat)))==0)
    {

    strcpy(rplyCat.m_entry.b_category,mainBoard[i].b_category);
    strcpy(rplyCat.m_entry.b_text,mainBoard[i].b_text);
    rplyCat.m_entry.b_date.day=mainBoard[i].b_date.day;
    rplyCat.m_entry.b_date.month=mainBoard[i].b_date.month;
    rplyCat.m_entry.b_date.year=mainBoard[i].b_date.year;
    if ((send(acpt_fd ,(char *) &rplyCat ,sizeof(rplyCat) ,0)) < 0 ) //send reply to sender
    failure("SendCaT failed");
    }

    }
    /* for (i = 0 ; i<rplyCNT.m_count ; i++)
    {
    printf("%d/%d/%d", mainBoard[i].b_date.day, mainBoard[i].b_date.month, mainBoard[i].b_date.year);
    //copyEntryDetails(&rplyCat.m_entry, &specificRequest[i]);
    printf("%d/%d/%d",rplyCat.m_entry.b_date.day,rplyCat.m_entry.b_date.month,rplyCat.m_entry.b_date.year);
    //send reply
    if ((send(acpt_fd ,(char *) &rplyCat ,sizeof(rplyCat) ,0)) < 0 ) //send reply to sender
    failure("SendCaT failed");
    sleep(2);
    }//for*/
    exit(EXIT_SUCCESS);
    }//if
    else
    {
    //recv
    if ((recv(acpt_fd ,(char *) &msgDate ,sizeof(msgDate) ,0 ) ) < 0 )//get Msg and sender addr
    failure("Receivedate failed");
    //calculate date
    rplyCNT.m_type = B_TYPE_CNT;
    rplyCNT.m_count = countThisDate(msgDate.m_start,mainBoard,specificRequest);

    //send reply
    if ((send(acpt_fd ,(char *) &rplyCNT ,sizeof(rplyCNT) ,0 )) < 0 ) //send reply to sender
    failure("SendCNTDate failed");
    //calculate
    rplyDate.m_type = B_TYPE_ENT;
    for (i = 0 ; i<rplyCNT.m_count ; i++)
    {
    copyEntryDetails(&rplyDate.m_entry, &specificRequest[i]);
    //send reply
    if ((send(acpt_fd ,(char *) &rplyDate ,sizeof(rplyDate) ,0) ) < 0 ) //send reply to sender
    failure("SendDate failed");
    }
    exit(EXIT_SUCCESS);
    }//else
    //abort();//son is out
    } //if
    else{
    close(acpt_fd);
    }
    }//else
    } //while
    //close
    /*if (close(sock_fd) < 0)
    failure("close recv socket failed");
    if (close(acpt_fd) < 0)
    failure("close accept socket failed");*/

    }//main


    void copyEntryDetails(board_ent_t * to, board_ent_t * from)
    {
    to->b_date.day = from->b_date.day; //fill date
    to->b_date.month = from->b_date.month;
    to->b_date.year = from->b_date.year;
    strcpy(to->b_category ,from->b_category); //fill categotry
    strcpy(to->b_text ,from->b_text); //fill text
    // printf("%s\n",to->b_text);

    }

    int countThisCategory(char * category, board_ent_t* mainBoard, board_ent_t* specificRequest)
    {
    int i, countShows = 0;
    for (i = 0 ; i<B_ENT_CNT ; i++)
    if ( strncmp(category,mainBoard[i].b_category,strlen(category)) == 0)
    {
    countShows++;
    copyEntryDetails(&specificRequest[i], &mainBoard[i]);//saving (coping) the specific category entries for sending them later

    }

    return countShows;
    }

    int countThisDate(date_t date, board_ent_t* mainBoard, board_ent_t* specificRequest)
    {
    int i, countShows = 0;
    for (i = 0 ; i<B_ENT_CNT ; i++)
    if ( (date.day == mainBoard[i].b_date.day) && (date.month == mainBoard[i].b_date.month) && (date.year == mainBoard[i].b_date.year) )
    {
    countShows++;
    copyEntryDetails(&specificRequest[i], &mainBoard[i]);//saving (coping) the specific date entries for sending them later
    }

    return countShows;
    }

    void failure (char *msg)
    {
    perror(msg);
    exit(EXIT_FAILURE);
    }
    void printMsg(msg_ent_t s)
    {
    printf("%d/%d/%d",s.m_entry.b_date.day,s.m_entry.b_date.month,s.m_entry.b_date.year);
    printf(" ");
    printf("%s",s.m_entry.b_category);
    printf("%s\n",s.m_entry.b_text);
    }