Facebook
From Mungo Peafowl, 5 Years ago, written in Plain Text.
Embed
Download Paste or View Raw
Hits: 260
  1. #include <netdb.h>
  2. #include <netinet/in.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <sys/socket.h>
  6. #include <sys/types.h>
  7. #include <signal.h>
  8. #define SA struct sockaddr
  9. #define MAX 80
  10.  
  11.  
  12. typedef struct token{
  13.     int destPortNumber;
  14.     int sourcePortNumber;
  15.  
  16. }Token;
  17.  
  18. typedef struct message{
  19.     int destPortNumber;
  20.     int sourcePortNumber;
  21.    // string text;
  22.    // bool ifDelivered;
  23. }Message;
  24.  
  25. int connfd;
  26. char buff[MAX];
  27. int sockfd,sockfd2,connfd2,internalIn,internalOut,internalConnfd,mcastSocketfd;
  28. int SELF_PORT,PREV_PORT,MCAST_PORT;
  29. void sendToken()
  30. {
  31.     char buff[MAX];
  32.     char* text = "token\n";
  33.     for(int i = 0; i<strlen(text); i++){
  34.         buff[i] = text[i];
  35.     }
  36.     char addresBuff[4];
  37.     int address;
  38.     read(internalConnfd, buff, sizeof(buff));
  39.     if(strncmp(buff,"token\n",5) == 0){
  40.  
  41.         printf("Do you want to send message?(y/n)\n");
  42.         if(getchar() == 'y' || getchar() == 'Y'){
  43.             printf("Enter message?\n");
  44.             getchar();
  45.             int n = 0;
  46.             while ((buff[n++] = getchar()) != '\n')
  47.                 ;
  48.         }
  49.     }
  50.     if(strncmp(buff,"message",6) == 0){
  51.         for(int i=0;i<4;i++){
  52.             addresBuff[i] = buff[8+i];
  53.         }
  54.         address = atoi(addresBuff);
  55.         printf("Adress: = %d\n",address);
  56.         if(address == SELF_PORT){
  57.             printf("I got message! %s",buff);
  58.             char* text = "token\n";
  59.             for(int i = 0; i<strlen(text); i++){
  60.                 buff[i] = text[i];
  61.             }
  62.         }
  63.     }
  64.  
  65.     write(connfd, buff, sizeof(buff));
  66.     printf("Token send! %s here\n",buff);
  67.  
  68.     sleep(4);
  69.     if (strncmp("exit", buff, 4) == 0) {
  70.         printf("Server Exit...\n");
  71.        // break;
  72.     }
  73.  
  74.  
  75. }
  76.  
  77. void sendToken2()
  78. {
  79.     //char buff[MAX];
  80.  
  81.     printf("Do you want to send message?(y/n)\n");
  82.     if(getchar() == 'y' || getchar() == 'Y'){
  83.         printf("Enter message: ");
  84.         bzero(buff, MAX);
  85.         int n = 0;
  86.         getchar();
  87.         while ((buff[n++] = getchar()) != '\n')
  88.             ;
  89.  
  90.         printf("Message end! \n");
  91.     }
  92.     else{
  93.         char* text = "token\n";
  94.         for(int i = 0; i<strlen(text); i++){
  95.             buff[i] = text[i];
  96.         }
  97.     }
  98.     sleep(2);
  99.     write(connfd, buff, sizeof(buff));
  100.     printf("Token send!\n");
  101.     if (strncmp("exit", buff, 4) == 0) {
  102.         printf("Server Exit...\n");
  103.         // break;
  104.     }
  105. }
  106.  
  107. void func2(int sockfd)
  108. {
  109.     char buff[MAX];
  110.     int n;
  111.     for (;;) {
  112.         bzero(buff, sizeof(buff));
  113.         read(sockfd, buff, sizeof(buff));
  114.         printf("I got : %s", buff);
  115.         if ((strncmp(buff, "exit", 4)) == 0) {
  116.             printf("Client Exit...\n");
  117.             break;
  118.         }
  119.     }
  120.     sleep(2);
  121. }
  122.  
  123. closeSockets(){
  124.  
  125.     close(sockfd);
  126.     close(sockfd2);
  127.     close(connfd);
  128.  
  129. }
  130. int main(int argc, char *argv[]) {
  131.  
  132.   //  signal(SIGINT,closeSockets());
  133.  
  134.  
  135.     MCAST_PORT = 3000;
  136.     if(argc != 6){
  137.         printf("Improper arguments number!\n");
  138.         return -1;
  139.     }
  140.     //const char ID = argv[0];
  141.     SELF_PORT = atoi(argv[2]);
  142.     PREV_PORT = atoi(argv[3]);
  143.     const int INTERNAL_PORT = 10000+getpid();
  144.     int hasToken = atoi(argv[4]);
  145.     char buffer[1024] = {0};
  146.     struct sockaddr_in self_address;
  147.     printf("Port is %s \n",argv[2]);
  148.  
  149.  
  150.     // server side
  151.     int  len;
  152.     struct sockaddr_in servaddr, cli;
  153.     struct sockaddr_in internaladdrIn;
  154.     struct sockaddr_in internaladdrIn2;
  155.     struct sockaddr_in internaladdrOut;
  156.     struct sockaddr_in mcast;
  157.  
  158.     // client  side
  159.  
  160.     struct sockaddr_in prev_servaddr, cli2;
  161.  
  162.  
  163.  
  164.     ////
  165.     pid_t child_pid,parent_pid;
  166.     parent_pid = getpid();
  167.     child_pid = fork();
  168.     if(child_pid!=0) { // parent
  169.  
  170.         // socket for communication with succesor
  171.         signal(SIGUSR1,sendToken);
  172.         sockfd = socket(AF_INET, SOCK_STREAM, 0);
  173.         if (sockfd == -1) {
  174.             printf("socket creation failed...\n");
  175.             exit(0);
  176.         }
  177.         else
  178.             printf("Socket successfully created..\n");
  179.         bzero(&servaddr, sizeof(servaddr));
  180.  
  181.         servaddr.sin_family = AF_INET;
  182.         servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
  183.         servaddr.sin_port = htons(SELF_PORT);
  184.  
  185.         if ((bind(sockfd, (SA*)&servaddr, sizeof(servaddr))) != 0) {
  186.             printf("socket bind failed...\n");
  187.             exit(0);
  188.         }
  189.         else
  190.             printf("Socket successfully binded..\n");
  191.  
  192.         if ((listen(sockfd, 5)) != 0) {
  193.             printf("Listen failed...\n");
  194.             exit(0);
  195.         }
  196.         else
  197.             printf("Server listening..\n");
  198.         len = sizeof(cli);
  199.  
  200.         connfd = accept(sockfd, (SA*)&cli, &len);
  201.         if (connfd < 0) {
  202.             printf("server acccept failed...\n");
  203.             exit(0);
  204.         }
  205.         else
  206.             printf("server acccept the client...\n");
  207.  
  208.         // internal connection:
  209.  
  210.         printf("Here is beginnig!");
  211.         internalIn = socket(AF_INET, SOCK_STREAM, 0);
  212.         if (internalIn == -1) {
  213.             printf("socket creation failed...\n");
  214.             exit(0);
  215.         }
  216.  
  217.         bzero(&internaladdrIn2, sizeof(internaladdrIn2));
  218.  
  219.         internaladdrIn2.sin_family = AF_INET;
  220.         internaladdrIn2.sin_addr.s_addr = htonl(INADDR_ANY);
  221.         internaladdrIn2.sin_port = htons(INTERNAL_PORT);
  222.  
  223.         if ((bind(internalIn, (SA*)&internaladdrIn2, sizeof(internaladdrIn2))) != 0) {
  224.             printf("socket bind failed...\n");
  225.             exit(0);
  226.         }
  227.  
  228.         if ((listen(internalIn, 5)) != 0) {
  229.             printf("Listen failed...\n");
  230.             exit(0);
  231.         }
  232.         int len2 = sizeof(internaladdrOut);
  233.  
  234.         internalConnfd = accept(internalIn, (SA*)&internaladdrOut, &len2);
  235.         if (internalConnfd < 0) {
  236.             printf("server acccept failed...\n");
  237.             exit(0);
  238.         }
  239.         printf("Here is ok! \n");
  240.         // end of internal connection
  241.  
  242.  
  243.         if(hasToken == 1)
  244.             sendToken2();
  245.  
  246.         for(;;){
  247.          //   printf("sender waiting! \n");
  248.         }
  249.         // After chatting close the socket
  250.         close(sockfd);
  251.  
  252.     } else { // child
  253.  
  254.         sockfd2 = socket(AF_INET, SOCK_STREAM, 0);
  255.         if (sockfd2 == -1) {
  256.             printf("socket creation failed...\n");
  257.             exit(0);
  258.         }
  259.         else
  260.             printf("Socket successfully created..\n");
  261.         bzero(&prev_servaddr, sizeof(prev_servaddr));
  262.  
  263.         // assign IP, PORT
  264.         prev_servaddr.sin_family = AF_INET;
  265.         prev_servaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
  266.         prev_servaddr.sin_port = htons(PREV_PORT);
  267.  
  268.         // connect the client socket to server socket
  269.         while (connect(sockfd2, (SA*)&prev_servaddr, sizeof(prev_servaddr)) != 0) {
  270.             printf("connection with the server failed...\n");
  271.             printf("Trying again");
  272.             sleep(1);
  273.         }
  274.  
  275.         //internal connection
  276.  
  277.           internalOut = socket(AF_INET, SOCK_STREAM, 0);
  278.         if (internalOut == -1) {
  279.             printf("socket creation failed...\n");
  280.             exit(0);
  281.         }
  282.         else
  283.             //printf("Socket successfully created..\n");
  284.         bzero(&internaladdrIn, sizeof(internaladdrIn));
  285.  
  286.         // assign IP, PORT
  287.         internaladdrIn.sin_family = AF_INET;
  288.         internaladdrIn.sin_addr.s_addr = inet_addr("127.0.0.1");
  289.         internaladdrIn.sin_port = htons(INTERNAL_PORT);
  290.  
  291.         // connect the client socket to server socket
  292.         while (connect(internalOut, (SA*)&internaladdrIn, sizeof(internaladdrIn)) != 0) {
  293.             printf("connection with the server failed...\n");
  294.             printf("Trying again");
  295.             sleep(1);
  296.         }
  297.         //end of internal connection
  298.  
  299.         // multicast socket
  300.  
  301.         mcastSocketfd = socket(AF_INET, SOCK_DGRAM, 0);
  302.         if (mcastSocketfd == -1) {
  303.             printf("socket creation failed...\n");
  304.             exit(0);
  305.         }
  306.  
  307.         memset(&mcast,0, sizeof(mcast));
  308.  
  309.         // assign IP, PORT
  310.         mcast.sin_family = AF_INET;
  311.         mcast.sin_addr.s_addr = inet_addr("127.0.0.1");
  312.         mcast.sin_port = htons(MCAST_PORT);
  313.  
  314.  
  315.  
  316.  
  317.  
  318.         // end of multicast socekt
  319.  
  320.  
  321.         int n;
  322.         for (;;) {
  323.             read(sockfd2, buff, sizeof(buff));
  324.             sendto(mcastSocketfd, buff, sizeof(buff),
  325.                    0, (const struct sockaddr *) &mcast,
  326.                    sizeof(mcast));
  327.             printf("Pewnie już poszło! :)");
  328.             printf("I got: %s", buff);
  329.             if((strncmp(buff, "token\n", 4)) == 0 || (strncmp(buff, "message", 4)) == 0 ){
  330.                 write(internalOut, buff, sizeof(buff));
  331.                 kill(getppid(),SIGUSR1);
  332.                 printf("I know what i get! \n");
  333.             }
  334.             else if ((strncmp(buff, "exit", 4)) == 0) {
  335.                 printf("Client Exit...\n");
  336.                 break;
  337.             }
  338.             else{
  339.                 printf("I don't know what I get :( \n");
  340.             }
  341.             sleep(2);
  342.         }
  343.     }
  344.  
  345.     return 0;
  346. }