Search code examples
csocketsuptime

How to get uptime of command in socket


The task was to write a program using INET domain, so I did. But there is one small thing to do that I don't know how to perform. the first non-blank character of the input line is 'u', the server will send to the client the output of the 'uptime' command executed on the server's host.

Program is running under Linux(Ubuntu).

Which could be like:

    if (strcmp(send_data , "u") == 0 || strcmp(send_data , "U") == 0)
    {
        send(sock, uptimevar, strlen(uptimevar), 0);               
    }

But how to get uptime of any command in C?

Server Code:

/* tcpserver.c */

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/sysinfo.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>

int main()
{
int sock, connected, bytes_recieved , true = 1;  
char send_data [1024] , recv_data[1024];       

struct sockaddr_in server_addr,client_addr/*, sysinfo*/;    
int sin_size;

if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
    perror("Socket");
    exit(1);
}

if (setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,&true,sizeof(int)) == -1) {
    perror("Setsockopt");
    exit(1);
}

server_addr.sin_family = AF_INET;         
server_addr.sin_port = htons(1237);     
server_addr.sin_addr.s_addr = INADDR_ANY; 
bzero(&(server_addr.sin_zero),8); 

if (bind(sock, (struct sockaddr *)&server_addr, sizeof(struct sockaddr))
                                                               == -1) {
    perror("Unable to bind");
    exit(1);
}

if (listen(sock, 5) == -1) {
    perror("Listen");
    exit(1);
}

printf ("\nTCPServer Waiting for client on port 5000");
    fflush(stdout);
while(1)
{  

    sin_size = sizeof(struct sockaddr_in);

    connected = accept(sock, (struct sockaddr *)&client_addr,&sin_size);

    printf("\n I got a connection from (%s , %d)",
           inet_ntoa(client_addr.sin_addr),ntohs(client_addr.sin_port));

    while (1)
    {
        printf("\n SEND (q or Q to quit) : ");
        fgets(send_data, sizeof(send_data), stdin);

        if (strcmp(send_data , "q") == 0 || strcmp(send_data , "Q") == 0)
        {
          send(connected, send_data,strlen(send_data), 0); 
          close(connected);
          break;
        }

        else 
        {
            send(connected, send_data,strlen(send_data), 0);  
            //printf("Uptime = %ld\n", connected.uptime);

            bytes_recieved = recv(connected,recv_data,1024,0);

            recv_data[bytes_recieved] = '\0';
        }
        if (strcmp(recv_data , "q") == 0 || strcmp(recv_data , "Q") == 0)
        {
          close(connected);
          break;
        }

        else {
            printf("\n RECIEVED DATA = %s " , recv_data);
            fflush(stdout);   
        }
    }
}       
close(sock);
return 0;
}

Client Code:

/* tcpclient.c */

#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>


int main()
{

int sock, bytes_recieved;  
char send_data[1024],recv_data[1024];
struct hostent *host;
struct sockaddr_in server_addr;  

host = gethostbyname("127.0.0.1");

if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
    perror("Socket");
    exit(1);
}

server_addr.sin_family = AF_INET;     
server_addr.sin_port = htons(1237);   
server_addr.sin_addr = *((struct in_addr *)host->h_addr);
bzero(&(server_addr.sin_zero),8); 

if (connect(sock, (struct sockaddr *)&server_addr,
            sizeof(struct sockaddr)) == -1) 
{
    perror("Connect");
    exit(1);
}

while(1)
{
    bytes_recieved=recv(sock,recv_data,1024,0);
    recv_data[bytes_recieved] = '\0';

    if (strcmp(recv_data , "q") == 0 || strcmp(recv_data , "Q") == 0)
    {
        close(sock);
        break;
    }

    else 
    {
        printf("\nRecieved data = %s " , recv_data);
        printf("\nSEND (q or Q to quit) : ");
        fgets(send_data, sizeof(send_data), stdin);
    } 
    if (strcmp(send_data , "q") == 0 || strcmp(send_data , "Q") == 0)
    {
        send(sock, send_data, strlen(send_data), 0);   
        close(sock);            
        break;
    }
    else
    {
        send(sock,send_data, strlen(send_data), 0);           
    }
}   
return 0;
}

Modification:

/* tcpserver.c */

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/sysinfo.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>

int main()
{
int sock, connected, bytes_recieved , true = 1;  
char send_data [1024] , recv_data[1024];       
struct sockaddr_in server_addr,client_addr/*, sysinfo*/; 
struct sysinfo info;   
int sin_size;

if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
    perror("Socket");
    exit(1);
}

if (setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,&true,sizeof(int)) == -1) {
    perror("Setsockopt");
    exit(1);
}

server_addr.sin_family = AF_INET;         
server_addr.sin_port = htons(1237);     
server_addr.sin_addr.s_addr = INADDR_ANY; 
bzero(&(server_addr.sin_zero),8); 

if (bind(sock, (struct sockaddr *)&server_addr, sizeof(struct sockaddr))
                                                               == -1) {
    perror("Unable to bind");
    exit(1);
}

if (listen(sock, 5) == -1) {
    perror("Listen");
    exit(1);
}

printf ("\nTCPServer Waiting for client on port 1237");
    fflush(stdout);
while(1)
{  

    sin_size = sizeof(struct sockaddr_in);

    connected = accept(sock, (struct sockaddr *)&client_addr,&sin_size);

    //sysinfo(&connected);
    printf("\n I got a connection from (%s , %d)",
           inet_ntoa(client_addr.sin_addr),ntohs(client_addr.sin_port));
    send(connected, "Hello this is a simple server", 100, 1);

    while (1)
    {
        printf("\n SEND (q or Q to quit) : ");
        fgets(send_data, sizeof(send_data), stdin);

        bytes_recieved = recv(connected,recv_data,1024,0);
        recv_data[bytes_recieved] = '\0';

        if (strcmp(recv_data , "u") == 0 || strcmp(recv_data , "U") == 0)
            {
            if (sysinfo(&info) == 0) {
               snprintf(send_data, sizeof send_data, "Uptime: %ld seconds\n", info.uptime);
            } else {
               snprintf(send_data, sizeof send_data, "Error getting uptime: %s\n", strerror(errno));
            }
            send(connected, send_data,strlen(send_data), 0);  
        }

    }       
    close(sock);
    return 0;
}
}

Solution

  • You shouldn't execute the uptime command, instead call the API from your code to obtain the uptime, on linux this is done with the sysinfo() function.

    #include <sys/sysinfo.h>
    ...
    
    struct sysinfo info
    
    if (sysinfo(&info) == 0) {
       snprintf(send_data, sizeof send_data, "Uptime: %ld seconds\n", info.uptime);
    } else {
       snprintf(send_data, sizeof send_data, "Error getting uptime: %s\n", strerror(errno));
    }
    
    send(sock, send_data, strlen(send_data), 0);