Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<stdio.h>
- #include<stdlib.h>
- #include<string.h> //strlen
- #include<sys/socket.h>
- #include<arpa/inet.h> //inet_addr
- #include<unistd.h> //write
- #include<stddef.h>
- int main(int argc, char *argv[])
- {
- int socket_desc, new_sd, c, sd;
- struct sockaddr_in server, client;
- char *message;
- //Create socket
- socket_desc = socket(AF_INET, SOCK_STREAM, 0);
- if (socket_desc == -1)
- {
- puts("Could not create fsocket");
- }
- //Prepare the sockaddr_in structure
- server.sin_family = AF_INET;
- server.sin_addr.s_addr = INADDR_ANY;
- server.sin_port = htons(8888);
- //Bind
- if (bind(socket_desc, (struct sockaddr *)&server, sizeof(server)) < 0)
- {
- puts("bind failed");
- return 1;
- }
- puts("bind done");
- //Listen
- listen(socket_desc, 3);
- //Accept and incoming connection
- puts("Waiting for incoming connections...");
- c = sizeof(struct sockaddr_in);
- const int RECV_BUF_SIZE = 512;
- char recv_buf[RECV_BUF_SIZE];
- int n, nwrote;
- while (1)
- {
- // try to accept socket
- new_sd = accept(socket_desc, (struct sockaddr *)&client, (socklen_t*)&c);
- // > 0 - real socket, 0==localhost
- if (new_sd >= 0) {
- puts("Connection accepted\r\n");
- int i = 0;
- int fnd = 0; // terminating character found
- int tread = 0; // total bytes read
- // receive loop
- do {
- // read a max possible bytes from buffer
- if ((n = read(new_sd, &recv_buf[tread], RECV_BUF_SIZE - tread)) < 0) {
- puts("error reading from socket, closing socket\r\n");
- break;
- }
- // succesfull read
- if (n > 0)
- {
- printf("%d rcvd\r\n", n);
- tread += n;
- // should never happen
- if (tread >= RECV_BUF_SIZE) {
- // flag as error
- fnd = 2;
- break;
- }
- }
- // break after end of the message
- for (i = 0; i < tread; i++) {
- // test for terminatign character
- if (recv_buf[i] == 0)
- {
- puts("0 found\r\n");
- fnd = 1;
- }
- }
- } while (!fnd);
- // we may write anywhere, but this one control the ACT LED
- FILE *fp = fopen("/sys/class/leds/led0/brightness", "w");
- if (fp != NULL) {
- fwrite(recv_buf, 1, strlen(recv_buf), fp);
- fclose(fp);
- } else {
- printf("error opening LED0\r\n");
- }
- // read temperature
- float temp;
- fp = fopen("/sys/class/thermal/thermal_zone0/temp", "r");
- if (fp != NULL) {
- fscanf(fp, "%f", &temp);
- temp /= 1000;
- fclose(fp);
- }
- // close connection if buffer overrunned
- if (fnd > 1) {
- printf("an error occured\r\n");
- close(new_sd);
- break;
- }
- printf("sending response %f\r\n", temp);
- int twrote = 0; // total bytes written
- int sent = 0; // sent completition flag
- char snd_buf[RECV_BUF_SIZE]; // will send from this buf
- // print temperature to recv buf
- sprintf(snd_buf, "%f", temp);
- // reply to client loop, see rcv loop for better understanding
- do {
- n = write(new_sd, &snd_buf[twrote], strlen(snd_buf) - twrote + 1 );
- if (n < 0) {
- puts("ERROR responding to client echo request\r\n");
- puts("Closing socket\r\n");
- close(new_sd);
- break;
- }
- if (n > 0) {
- twrote += n;
- if (twrote == strlen(snd_buf) +1 ) {
- sent = 1;
- }
- }
- } while (!sent);
- printf("OK sent %d\r\n", twrote);
- // we are done, wait for new connection ...
- close(new_sd);
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement