Simple Client
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <string.h>
void interact(FILE *rd, FILE * wr)
{ char inp[1000];
fprintf(wr, "add 3 5 7\n");
fflush(wr);
printf("sent: add 3 5 7\n");
fgets(inp, 999, rd);
printf("received: %s", inp);
fprintf(wr, "add 2 4 6\n");
fflush(wr);
printf("sent: add 2 4 6\n");
fgets(inp, 999, rd);
printf("received: %s", inp);
fprintf(wr, "exit\n");
fflush(wr);
printf("sent: exit\n");
fgets(inp, 999, rd);
printf("received: %s", inp); }
void main(int argc, char *argv[])
{ if (argc!=3)
{ fprintf(stderr, "usage: %s remote-host port-number\n", argv[0]);
exit(1); }
char server_name[1000];
strcpy(server_name, argv[1]);
int port_number;
int n=sscanf(argv[2], "%d", &port_number);
if (n!=1)
{ fprintf(stderr, "\"%s\" is not a valid port number\n", argv[2]);
exit(1); }
struct hostent * server_info=gethostbyname(server_name);
if (server_info==NULL)
{ fprintf(stderr, "(1) host \"%s\" not known\n", server_name);
exit(1); }
struct in_addr * server_addr=(struct in_addr *)server_info->h_addr;
if (server_addr->s_addr==NULL)
{ fprintf(stderr,"(2) host %s not known\n", inet_ntoa(*server_addr));
exit(1); }
struct sockaddr_in connection_descr;
bzero(&connection_descr, sizeof(connection_descr));
connection_descr.sin_family=AF_INET;
connection_descr.sin_addr.s_addr=server_addr->s_addr;
connection_descr.sin_port=htons(port_number);
int sock=socket(AF_INET, SOCK_STREAM, 0);
if (sock<0)
{ perror("socket failure");
exit(1); }
printf("\n[Connecting to %s (%s) on port %d]\n",
server_name, inet_ntoa(*server_addr), port_number);
n=connect(sock, (sockaddr *)&connection_descr, sizeof(connection_descr));
if (n<0)
{ perror("connect");
exit(1); }
FILE * r_file=fdopen(sock,"r");
FILE * w_file=fdopen(sock,"w");
if (r_file==NULL || w_file==NULL)
{ fprintf(stderr,"made a bad connection\n");
exit(1); }
interact(r_file, w_file);
fclose(r_file);
fclose(w_file);
printf("[finished]\n"); }