Advertisement
Alisator

Linux Server TCP/IP 2

Sep 2nd, 2016
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.38 KB | None | 0 0
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>    //strlen
  4. #include<sys/socket.h>
  5. #include<arpa/inet.h> //inet_addr
  6. #include<unistd.h>    //write
  7. #include<stddef.h>
  8. int main(int argc, char *argv[])
  9. {
  10.     int socket_desc, new_sd, c, sd;
  11.     struct sockaddr_in server, client;
  12.     char *message;
  13.  
  14.     //Create socket
  15.     socket_desc = socket(AF_INET, SOCK_STREAM, 0);
  16.     if (socket_desc == -1)
  17.     {
  18.         puts("Could not create fsocket");
  19.     }
  20.  
  21.     //Prepare the sockaddr_in structure
  22.     server.sin_family = AF_INET;
  23.     server.sin_addr.s_addr = INADDR_ANY;
  24.     server.sin_port = htons(8888);
  25.  
  26.     //Bind
  27.     if (bind(socket_desc, (struct sockaddr *)&server, sizeof(server)) < 0)
  28.     {
  29.         puts("bind failed");
  30.         return 1;
  31.     }
  32.     puts("bind done");
  33.  
  34.     //Listen
  35.     listen(socket_desc, 3);
  36.  
  37.     //Accept and incoming connection
  38.     puts("Waiting for incoming connections...");
  39.     c = sizeof(struct sockaddr_in);
  40.     const int RECV_BUF_SIZE = 512;
  41.     char recv_buf[RECV_BUF_SIZE];
  42.     int n, nwrote;
  43.  
  44.     while (1)
  45.     {
  46.         // try to accept socket
  47.         new_sd = accept(socket_desc, (struct sockaddr *)&client, (socklen_t*)&c);
  48.  
  49.         // > 0 - real socket, 0==localhost
  50.         if (new_sd >= 0) {
  51.  
  52.             puts("Connection accepted\r\n");
  53.  
  54.             int i = 0;
  55.             int fnd = 0; // terminating character found
  56.             int tread = 0; // total bytes read
  57.  
  58.             // receive loop
  59.             do {
  60.                 // read a max possible bytes from buffer
  61.                 if ((n = read(new_sd, &recv_buf[tread], RECV_BUF_SIZE - tread)) < 0) {
  62.                     puts("error reading from socket, closing socket\r\n");
  63.                     break;
  64.                 }
  65.  
  66.                 // succesfull read
  67.                 if (n > 0)
  68.                 {
  69.                     printf("%d rcvd\r\n", n);
  70.                     tread += n;
  71.                     // should never happen
  72.                     if (tread >= RECV_BUF_SIZE) {
  73.                         // flag as error
  74.                         fnd = 2;
  75.                         break;
  76.                     }
  77.                 }
  78.  
  79.                 // break after end of the message
  80.                 for (i = 0; i < tread; i++) {
  81.                     // test for terminatign character
  82.                     if (recv_buf[i] == 0)
  83.                     {
  84.                         puts("0 found\r\n");
  85.                         fnd = 1;
  86.                     }
  87.                 }
  88.  
  89.             } while (!fnd);
  90.  
  91.             // we may write anywhere, but this one control the ACT LED
  92.             FILE *fp = fopen("/sys/class/leds/led0/brightness", "w");
  93.             if (fp != NULL) {
  94.                 fwrite(recv_buf, 1, strlen(recv_buf), fp);
  95.                 fclose(fp);
  96.             } else {
  97.                 printf("error opening LED0\r\n");
  98.             }
  99.  
  100.             // read temperature
  101.             float temp;
  102.             fp = fopen("/sys/class/thermal/thermal_zone0/temp", "r");
  103.             if (fp != NULL) {
  104.                 fscanf(fp, "%f", &temp);
  105.                 temp /= 1000;
  106.                 fclose(fp);
  107.             }
  108.  
  109.             // close connection if buffer overrunned
  110.             if (fnd > 1) {
  111.                 printf("an error occured\r\n");
  112.                 close(new_sd);
  113.                 break;
  114.             }
  115.  
  116.             printf("sending response %f\r\n", temp);
  117.            
  118.             int twrote = 0; // total bytes written
  119.             int sent = 0;   // sent completition flag
  120.             char snd_buf[RECV_BUF_SIZE]; // will send from this buf
  121.             // print temperature to recv buf
  122.             sprintf(snd_buf, "%f", temp);
  123.             // reply to client loop, see rcv loop for better understanding
  124.             do {
  125.                 n = write(new_sd, &snd_buf[twrote], strlen(snd_buf) - twrote + 1 );
  126.                 if (n < 0) {
  127.                     puts("ERROR responding to client echo request\r\n");
  128.                     puts("Closing socket\r\n");
  129.                     close(new_sd);
  130.                     break;
  131.                 }
  132.                 if (n > 0) {
  133.                     twrote += n;
  134.                     if (twrote == strlen(snd_buf) +1 ) {
  135.                         sent = 1;
  136.                     }
  137.                 }
  138.             } while (!sent);
  139.            
  140.             printf("OK sent %d\r\n", twrote);
  141.             // we are done, wait for new connection ...
  142.             close(new_sd);
  143.         }
  144.     }
  145.     return 0;
  146. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement