Advertisement
Guest User

Untitled

a guest
Dec 6th, 2019
126
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.85 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <sys/un.h>
  4. #include <sys/socket.h>
  5. #include <unistd.h>
  6. #include <pthread.h>
  7. #include <errno.h>
  8. #include <netinet/in.h>
  9. #include <arpa/inet.h>
  10. #include <string.h>
  11. #include <strings.h>
  12. #include <netdb.h>
  13. #include <signal.h>
  14.  
  15. #define DEFAULT_PORT 80
  16. #define MAX_CONNECTIONS 20
  17. #define PAUSE_TIME_SEC 1
  18. #define BUFFER_SIZE 1000
  19.  
  20. extern int errno;
  21.  
  22. typedef struct sockaddr_in SocketAddress;
  23.  
  24. static volatile sig_atomic_t keep_running = 1;
  25.  
  26. static void sigHandler(int _)
  27. {
  28.     keep_running = 0;
  29. }
  30.  
  31. void setupSocketAddress(SocketAddress *socketAddress, int port)
  32. {
  33.     socketAddress->sin_family = AF_INET;
  34.     socketAddress->sin_addr.s_addr = htonl(INADDR_ANY);
  35.     socketAddress->sin_port = htons(port);
  36. }
  37.  
  38. void die(const char *message)
  39. {
  40.     printf("%s\n", message);
  41.     exit(1);
  42. }
  43.  
  44. void sendHelloMessage(int connectionFileDescriptor)
  45. {
  46.     // send hello message
  47.     char helloMessage[] = "Hello from server\n";
  48.  
  49.     write(connectionFileDescriptor, helloMessage, sizeof(helloMessage));
  50. }
  51.  
  52. void receiveFromClient(int connectionFileDescriptor)
  53. {
  54.     char buff[BUFFER_SIZE];
  55.  
  56.     // read from client
  57.     bzero(buff, BUFFER_SIZE);
  58.     read(connectionFileDescriptor, buff, sizeof(buff));
  59.  
  60.     printf("From client:\n%s\n", buff);
  61.     printf("Sending reply from client\n");
  62. }
  63.  
  64. void sendReplyFromServer(int connectionFileDescriptor)
  65. {
  66.     // send hello message
  67.     char replyFromServer[] = "Reply from server\n";
  68.  
  69.     write(connectionFileDescriptor, replyFromServer, sizeof(replyFromServer));
  70. }
  71.  
  72. void acceptClientMessage(int connectionFileDescriptor)
  73. {
  74.  
  75.     sendHelloMessage(connectionFileDescriptor);
  76.  
  77.     receiveFromClient(connectionFileDescriptor);
  78.  
  79.     sendReplyFromServer(connectionFileDescriptor);
  80. }
  81.  
  82. int main(int argc, char *argv[])
  83. {
  84.     int defaultPort = DEFAULT_PORT;
  85.     SocketAddress socketAddress, cli;
  86.     int socketFileDescriptor, socketBindOperation, socketListenOperation, connectionFileDescriptor;
  87.     char buff[1000];
  88.     socklen_t addrlen;
  89.     int true = 1, forkID;
  90.  
  91.     // signal(SIGINT, sigHandler);
  92.  
  93.     if (argc > 1)
  94.     {
  95.         defaultPort = atoi(argv[1]);
  96.     }
  97.  
  98.     socketFileDescriptor = socket(AF_INET, SOCK_STREAM, 0);
  99.     if (socketFileDescriptor == -1)
  100.     {
  101.         die("Socket create failed");
  102.     }
  103.     setsockopt(socketFileDescriptor, SOL_SOCKET, SO_REUSEADDR, &true, sizeof(int));
  104.  
  105.     setupSocketAddress(&socketAddress, defaultPort);
  106.  
  107.     socketBindOperation = bind(socketFileDescriptor, (struct sockaddr *)&socketAddress, sizeof(socketAddress));
  108.     if (socketBindOperation != 0)
  109.     {
  110.         printf("errno %d\n", errno);
  111.  
  112.         die("Socket bind failed...");
  113.     }
  114.     printf("Socket :%d binded...\n", defaultPort);
  115.  
  116.     socketListenOperation = listen(socketFileDescriptor, MAX_CONNECTIONS);
  117.     if (socketListenOperation != 0)
  118.     {
  119.         die("Listen failed...\n");
  120.     }
  121.     printf("Server Listening...\n");
  122.  
  123.     // multiple connections
  124.     //for (; keep_running;)
  125.     while (keep_running)
  126.     {
  127.         addrlen = sizeof(cli);
  128.         connectionFileDescriptor = accept(socketFileDescriptor, (struct sockaddr *)&cli, &addrlen);
  129.         if (connectionFileDescriptor == -1)
  130.         {
  131.             die("Server accept failed...");
  132.         }
  133.  
  134.         forkID = fork();
  135.         // child process
  136.         if (forkID == 0)
  137.         {
  138.             printf("Server accepted the client...\n");
  139.  
  140.             acceptClientMessage(connectionFileDescriptor);
  141.  
  142.             close(connectionFileDescriptor);
  143.             printf("Server closed the connection\n");
  144.  
  145.             exit(0);
  146.         }
  147.         // parent process
  148.         else{
  149.             wait(NULL);
  150.         }
  151.     }
  152.     // if it is parent
  153.     if (forkID != 0)
  154.     {
  155.         close(socketFileDescriptor);
  156.  
  157.         printf("Closed %d\n", getpid());
  158.     }
  159.     return 0;
  160. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement