Advertisement
Aaaaa988

spo3

Apr 9th, 2021
597
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.87 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <sys/socket.h>
  4. #include <arpa/inet.h>
  5. #include <string.h>
  6. #include <argp.h>
  7. #include <unistd.h>
  8.  
  9. int n_opt = 10;
  10. char *ip_arg, i_opt;
  11.  
  12. struct argp_option options[] = {{NULL,      'i', "NUM", 0, "Transmission delay in seconds"},
  13.                                 {NULL, 'n', "NUM", 0, "Number of iterations"},
  14.                                 {0}};
  15.  
  16. static int parse_opt(int key, char *arg, struct argp_state *state) {
  17.     int *arg_count = state->input;
  18.  
  19.     int tmp = arg ? strtol(arg, NULL, 10) : 0;
  20.     if (tmp < 1 && (key == 'i' || key == 'n')) {
  21.         fprintf(stderr, "error parsing option -%c", key);
  22.         exit(EXIT_FAILURE);
  23.     }
  24.  
  25.     switch (key) {
  26.         case 'i':
  27.             i_opt = tmp;
  28.             break;
  29.         case 'n':
  30.             n_opt = tmp;
  31.             break;
  32.         case ARGP_KEY_ARG:
  33.             if (*arg_count > 0)
  34.                 ip_arg = arg;
  35.             (*arg_count)--;
  36.             break;
  37.         case ARGP_KEY_END:
  38.             printf("\n");
  39.             if (*arg_count > 0)
  40.                 argp_failure(state, 1, 0, "too few arguments");
  41.             else if (*arg_count < 0)
  42.                 argp_failure(state, 1, 0, "too many arguments");
  43.             break;
  44.     }
  45.     return 0;
  46. }
  47.  
  48. int main(int argc, char **argv) {
  49.     int sockfd, arg_count = 1;
  50.     struct sockaddr_in serv_addr;
  51.     char *srv_ip = NULL, *srv_port = NULL;
  52.  
  53.     struct argp argp = {options, parse_opt, "IP:PORT"};
  54.     argp_parse(&argp, argc, argv, 0, 0, &arg_count);
  55.  
  56.     for (int i = 0, n = strlen(ip_arg); i < n; i++)
  57.         if (ip_arg[i] == ':') {
  58.             srv_ip = malloc(15 * sizeof(char));
  59.             srv_port = malloc(5 * sizeof(char));
  60.             strncpy(srv_ip, ip_arg, i);
  61.             strncpy(srv_port, ip_arg + i + 1, n - i - 1);
  62.             break;
  63.         }
  64.  
  65.     if (!srv_ip || !srv_port) {
  66.         fprintf(stderr, "failed to parse ip\n");
  67.         exit(EXIT_FAILURE);
  68.     }
  69.  
  70.     if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
  71.         fprintf(stderr, "socket failed\n");
  72.         exit(EXIT_FAILURE);
  73.     }
  74.  
  75.     serv_addr.sin_family = AF_INET;
  76.     serv_addr.sin_port = strtol(srv_port, NULL, 10);
  77.  
  78.     if (inet_pton(AF_INET, srv_ip, &serv_addr.sin_addr) <= 0) {
  79.         fprintf(stderr, "pton failed\n");
  80.         exit(EXIT_FAILURE);
  81.     }
  82.  
  83.     if (connect(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr))) {
  84.         fprintf(stderr, "connect failed\n");
  85.         exit(EXIT_FAILURE);
  86.     }
  87.  
  88.  
  89.     for (int i = 0; i < n_opt; i++) {
  90.         send(sockfd, &i_opt, 1, 0);
  91.         sleep(i_opt);
  92.     }
  93.  
  94.     return 0;
  95. }
  96.  
  97.  
  98.  
  99.  
  100.  
  101.  
  102.  
  103.  
  104.  
  105.  
  106.  
  107.  
  108.  
  109.  
  110.  
  111. #include <stdio.h>
  112. #include <stdlib.h>
  113. #include <unistd.h>
  114. #include <sys/types.h>
  115. #include <sys/socket.h>
  116. #include <netinet/in.h>
  117.  
  118.  
  119. int read_from_client(int filedes) {
  120.     char buffer;
  121.     int nbytes;
  122.  
  123.     nbytes = read(filedes, &buffer, 1);
  124.  
  125.     if (nbytes < 0) {
  126.         fprintf(stderr, "read failed\n");
  127.         exit(EXIT_FAILURE);
  128.     } else if (nbytes == 0) {
  129.         return -1;
  130.     }
  131.  
  132.     fprintf(stdout, "Server: got message: %d\n", buffer);
  133.     return 0;
  134. }
  135.  
  136. int main(int argc, char **argv) {
  137.     int sockfd;
  138.     struct sockaddr_in addr;
  139.     socklen_t addrlen = sizeof(addr);
  140.     fd_set active_fd_set, read_fd_set;
  141.  
  142.     if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
  143.         fprintf(stderr, "socket failed\n");
  144.         exit(EXIT_FAILURE);
  145.     }
  146.  
  147.     addr.sin_family = AF_INET;
  148.     addr.sin_addr.s_addr = INADDR_ANY;
  149.     addr.sin_port = 0;
  150.  
  151.     if (bind(sockfd, (struct sockaddr *) &addr, addrlen) < 0) {
  152.         fprintf(stderr, "bind failed\n");
  153.         exit(EXIT_FAILURE);
  154.     }
  155.  
  156.     getsockname(sockfd, (struct sockaddr *) &addr, &addrlen);
  157.     fprintf(stdout, "bound to port: %d\n", addr.sin_port);
  158.  
  159.     if (listen(sockfd, 3) < 0) {
  160.         fprintf(stderr, "listen failed\n");
  161.         exit(EXIT_FAILURE);
  162.     }
  163.  
  164.     FD_ZERO(&active_fd_set);
  165.     FD_SET(sockfd, &active_fd_set);
  166.  
  167.     while (sockfd) {
  168.         read_fd_set = active_fd_set;
  169.         if (select(FD_SETSIZE, &read_fd_set, NULL, NULL, NULL) < 0) {
  170.             fprintf(stderr, "select failed\n");
  171.             exit(EXIT_FAILURE);
  172.         }
  173.  
  174.         for (int i = 0; i < FD_SETSIZE; i++) {
  175.             if (FD_ISSET (i, &read_fd_set)) {
  176.                 if (i == sockfd) {
  177.                     int new;
  178.                     new = accept(sockfd, (struct sockaddr *) &addr, &addrlen);
  179.  
  180.                     if (new < 0) {
  181.                         fprintf(stderr, "accept failed\n");
  182.                         exit(EXIT_FAILURE);
  183.                     }
  184.  
  185.                     FD_SET(new, &active_fd_set);
  186.                 } else {
  187.                     if (read_from_client(i) < 0) {
  188.                         close(i);
  189.                         FD_CLR (i, &active_fd_set);
  190.                     }
  191.                 }
  192.             }
  193.         }
  194.     }
  195. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement