💾 Archived View for gmi.noulin.net › gitRepositories › spartserv › file › spartclient.c.gmi captured on 2023-01-29 at 13:30:27. Gemini links have been rewritten to link to archived content

View Raw

More Information

-=-=-=-=-=-=-

spartserv

Log

Files

Refs

README

spartclient.c (2001B)

     1 // Usage: spartclient hostname port path
     2 #include <stdio.h>
     3 #include <sys/types.h>
     4 #include <sys/socket.h>
     5 #include <netdb.h>
     6 #include <netinet/in.h>
     7 #include <string.h>
     8 #include <stdlib.h>
     9 #include <ctype.h>
    10 #include <unistd.h>
    11 
    12 int64_t parseInt(const char *string) {
    13     while (!isdigit(*string) && *string != '-' && *string != 0) {
    14         string++;
    15     }
    16     int64_t r = strtoll(string, NULL, 10);
    17     return(r);
    18 }
    19 
    20 int main(int ac, char **av){
    21     int sock;
    22     struct sockaddr_in server;
    23     struct hostent *hp;
    24     int mysock;
    25     char buf[8192] = {0};
    26     int rval;
    27     int i;
    28 
    29     if (ac < 4) {
    30         puts("Usage: spartclient hostname port path");
    31         return 0;
    32     }
    33 
    34     sock = socket(AF_INET, SOCK_STREAM, 0);
    35     if (sock < 0){
    36         perror("Failed to create socket");
    37     }
    38 
    39     server.sin_family = AF_INET;
    40 
    41     hp = gethostbyname(av[1]);
    42     if (hp==0) {
    43         perror("gethostbyname failed");
    44         close(sock);
    45         exit(1);
    46     }
    47 
    48     memcpy(&server.sin_addr, hp->h_addr, hp->h_length);
    49 
    50     int64_t port = parseInt(av[2]);
    51 
    52     if (port < 1 || port > 65000) {
    53         printf("Invalid port %d.\n", port);
    54         return 1;
    55     }
    56 
    57     server.sin_port = htons(port);
    58 
    59     if (connect(sock,(struct sockaddr *) &server, sizeof(server))){
    60         perror("connect failed");
    61         close(sock);
    62         exit(1);
    63     }
    64 
    65     // build request
    66     size_t len = strlen(av[1]);
    67     memcpy(buf, av[1], len);
    68     buf[len] = ' ';
    69     char *cursor = buf + len + 1;
    70     len = strlen(av[3]);
    71     memcpy(cursor, av[3], len);
    72     memcpy(cursor + len, " 0\r\n", strlen(" 0\r\n"));
    73     cursor += len + strlen(" 0\r\n");
    74 
    75     // send request
    76     if(send(sock, buf, cursor - buf, 0) < 0){
    77         perror("send failed");
    78         close(sock);
    79         exit(1);
    80     }
    81 
    82     // reveice server response
    83     rval = recv(sock, buf, sizeof(buf)-1 /* -1 to add end of string before printing */, 0);
    84     if (rval != -1 && rval != 0) {
    85         buf[rval] = 0;
    86         puts(buf);
    87     }
    88 
    89     close(sock);
    90 }
    91