Advertisement
Alisator

Linux Server TCP/IP

Sep 1st, 2016
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.38 KB | None | 0 0
  1. #include<stdio.h>
  2. #include<string.h>    //strlen
  3. #include<sys/socket.h>
  4. #include<arpa/inet.h> //inet_addr
  5. #include<unistd.h>    //write
  6. #include<stddef.h>
  7. int main(int argc, char *argv[])
  8. {
  9.     int socket_desc, new_sd, c, sd;
  10.     struct sockaddr_in server, client;
  11.     char *message;
  12.  
  13.     //Create socket
  14.     socket_desc = socket(AF_INET, SOCK_STREAM, 0);
  15.     if (socket_desc == -1)
  16.     {
  17.         puts("Could not create fsocket");
  18.     }
  19.  
  20.     //Prepare the sockaddr_in structure
  21.     server.sin_family = AF_INET;
  22.     server.sin_addr.s_addr = INADDR_ANY;
  23.     server.sin_port = htons(8888);
  24.  
  25.     //Bind
  26.     if (bind(socket_desc, (struct sockaddr *)&server, sizeof(server)) < 0)
  27.     {
  28.         puts("bind failed");
  29.         return 1;
  30.     }
  31.     puts("bind done");
  32.  
  33.     //Listen
  34.     listen(socket_desc, 3);
  35.  
  36.     //Accept and incoming connection
  37.     puts("Waiting for incoming connections...");
  38.     c = sizeof(struct sockaddr_in);
  39.     const int RECV_BUF_SIZE = 512;
  40.     char recv_buf[RECV_BUF_SIZE];
  41.     int n, nwrote;
  42.  
  43.     while (1)
  44.     {
  45.         new_sd = accept(socket_desc, (struct sockaddr *)&client, (socklen_t*)&c);
  46.        
  47.         if (new_sd >= 0) {
  48.             puts("Connection accepted\r\n");
  49.  
  50.             int i = 0;
  51.             int fnd = 0;
  52.             int tread = 0;
  53.             do {
  54.                 // read a max possible bytes from buffer
  55.                 if ((n = read(new_sd, &recv_buf[tread], RECV_BUF_SIZE - tread)) < 0) {
  56.                     puts("error reading from socket, closing socket\r\n");
  57.                     break;
  58.                 }
  59.  
  60.  
  61.                 if (n > 0)
  62.                 {
  63.                     printf("%d rcvd\r\n", n);
  64.                     tread += n;
  65.  
  66.                     if (tread >= RECV_BUF_SIZE) {
  67.                         // should never happen
  68.                         fnd = 2;
  69.                         break;
  70.                     }
  71.                 }
  72.  
  73.                 // break after end of the message
  74.                 for (i = 0; i < tread; i++) {
  75.                     // test for terminatign character
  76.                     if (recv_buf[i] == 0)
  77.                     {
  78.                         puts("0 found\r\n");
  79.                         fnd = 1;
  80.                     }
  81.                 }
  82.  
  83.             } while (!fnd);
  84.  
  85.             if (fnd > 1) {
  86.                 printf("an error occured\r\n");
  87.                 close(new_sd);
  88.                 break;
  89.             }
  90.  
  91.             // should use total write here as well
  92.             int twrote = 0;
  93.             int sent = 0;
  94.             do {
  95.                 n = write(new_sd, &recv_buf[twrote], tread - twrote);
  96.                 // handle request reply to vlient
  97.                 if (n < 0) {
  98.                     puts("ERROR responding to client echo request\r\n");
  99.                     puts("Closing socket\r\n");
  100.                     close(new_sd);
  101.                     break;
  102.                 }
  103.                 if (n > 0) {
  104.                     twrote += n;
  105.                     if (twrote == tread) {
  106.                         sent = 1;
  107.                     }
  108.                 }
  109.             } while (!sent);
  110.  
  111.             printf("OK sent %d\r\n", twrote);
  112.             close(new_sd);
  113.         }
  114.     }
  115.     return 0;
  116. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement