Facebook
From ponczuTM, 3 Years ago, written in C.
Embed
Download Paste or View Raw
Hits: 130
  1. #define _POSIX_SOURCE
  2. #include <sys/types.h>
  3. #include <sys/socket.h>
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <netinet/in.h>
  7. #include <arpa/inet.h>
  8. #include <netdb.h> /* gethostbyname */
  9. #include <unistd.h>
  10. #include <string.h>
  11. #include <strings.h> /* dla bcopy */
  12. #include <signal.h>
  13. #include <sys/wait.h>
  14.  
  15. #define h_addr h_addr_list[0]
  16.  
  17. struct my_msg
  18. {
  19.         char *name;
  20.         char text[255];
  21. };
  22.  
  23. void reap_zombies(int sig)
  24. {
  25.         while (waitpid(-1, NULL, WNOHANG) > 0)
  26.                 return;
  27. }
  28.  
  29. int main(int argc, char *argv[])
  30. {
  31.  
  32.         int sockfd, pid;
  33.         struct sockaddr_in server_addr, client_addr;
  34.         struct hostent *host;
  35.         struct my_msg msg;
  36.         int bindresult;
  37.         ssize_t bytes;
  38.         unsigned short n = 8888;
  39.         char default_name[2] = "NN";
  40.         socklen_t clilen;
  41.         msg.name = malloc(sizeof(char));
  42.  
  43.         signal(SIGCHLD, reap_zombies);
  44.  
  45.         host = gethostbyname(argv[1]);
  46.         /*bcopy((char *)host->h_addr, (char *)&server_addr.sin_addr, host->h_length);*/
  47.  
  48.         sockfd = socket(AF_INET, SOCK_DGRAM, 0);
  49.  
  50.         server_addr.sin_family = AF_INET;
  51.         server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
  52.         server_addr.sin_port = htons(n);
  53.  
  54.         client_addr.sin_family = AF_INET;
  55.         bcopy((char *)host->h_addr, (char *)&client_addr.sin_addr, host->h_length);
  56.         /*client_addr.sin_addr.s_addr = inet_addr(argv[1]);*/
  57.         client_addr.sin_port = htons(n);
  58.  
  59.         bindresult = bind(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr));
  60.         printf("Creating socket (%s)\n",
  61.                                  (bindresult == 0) ? "OK" : "blad tworzenia gniazda");
  62.  
  63.         if (argc == 3)
  64.                 /*sscanf(argv[2], "%s", msg.name);*/
  65.                 strcpy(msg.name, argv[2]);
  66.         else
  67.                 /*sscanf(default_name, "%s", msg.name);*/
  68.                 strcpy(msg.name, default_name);
  69.  
  70.         if ((pid = fork()) == 0)
  71.         {
  72.                 while (1)
  73.                 {
  74.                         clilen = sizeof(client_addr);
  75.                         recvfrom(sockfd, &msg, sizeof(msg), 0, (struct sockaddr *)&client_addr, &clilen);
  76.                         /*printf("\n[%s]> ", msg.name);*/
  77.  
  78.                         if (strcmp(msg.text, "<end>") == 0)
  79.                         {
  80.                                 printf("[%s (%s) zakonczyl rozmowe]\n", msg.name, inet_ntoa(client_addr.sin_addr));
  81.                                 write(1, "[", 2);
  82.                                 write(1, msg.name, strlen(msg.name));
  83.                                 write(1, "]> ", 4);
  84.                                 /*free(msg.name);
  85.                                 close(sockfd);
  86.                                 exit(EXIT_FAILURE);*/
  87.                                 continue; /* serwer ma dalej dzialac, przeciez moze pojawic sie kolejny klient*/
  88.                         }
  89.  
  90.                         printf("\n[%s (%s)]> %s\n", msg.name, inet_ntoa(server_addr.sin_addr), msg.text);
  91.                         write(1, "[", 2);
  92.                         write(1, msg.name, strlen(msg.name));
  93.                         write(1, "]> ", 4);
  94.                 }
  95.         }
  96.         else
  97.         {
  98.  
  99.                 printf("starting with %s , write <end> to end.\n", inet_ntoa(client_addr.sin_addr));
  100.  
  101.                 while (1)
  102.                 {
  103.                         printf("[%s]> ", msg.name);
  104.                         fgets(msg.text, 255, stdin);
  105.                         msg.text[strlen(msg.text) - 1] = '\0';
  106.  
  107.                         bytes = sendto(sockfd, &msg, sizeof(msg), 0,
  108.                                                                                  (struct sockaddr *)&client_addr, sizeof(client_addr));
  109.  
  110.                         if (strcmp(msg.text, "<end>") == 0)
  111.                         {
  112.                                 kill(pid, SIGKILL); /* ubijam serwer, inaczej powstanie zombiak (reap_zombies tu nie zadziaĹ‚a, bo nigdzie fork nie robi exit)*/
  113.                                 break;
  114.                         }
  115.                 }
  116.         }
  117.         free(msg.name);
  118.         close(sockfd);
  119.         return 0;
  120. }
  121.  
  122.