/*
 * daytime-client-tcp.c - a simple TCP client
 */
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <netdb.h>

#define MAXDATASIZE 100
#define DEFAULTPORT 13

int main(int argc, char *argv[])
  {
  int server;
  int numbytes;
  struct sockaddr_in server_addr;
  struct hostent *host;
  char buf[MAXDATASIZE];
  int portnumber;

 /* Kommandozeile einlesen */
  switch (argc)
    {
    case 3:
      /* Host und Portnummer von der Kommandozeile */
      portnumber = atol(argv[2]);
      if (portnumber <= 0 || portnumber > 65535)
        {
        perror("Falsche Portnummer (muss zwischen 0 und 65535 liegen)");
        return 1;
        }  
      host = gethostbyname(argv[1]);
      if (host == NULL)
        {
        perror("Unbekannter Host");
        return 1;
        }
      break;
    default:
      fprintf(stderr, "Usage: %s [host] [port] (0 < port < 65535)\nBeispiel: %s localhost 1024\n", 
                      argv[0], argv[0]);
      return 1;
    }


  /* Set protocol to "0" to have socket() choose the correct protocol. */
  if ((server = socket(PF_INET, SOCK_STREAM, 0)) < 0) 
    {
    perror("Fehler beim Anlegen des Socket");
    return 2;
    }

  memset(&server_addr, 0, sizeof (server_addr));
  server_addr.sin_family = AF_INET;
  server_addr.sin_port = htons(portnumber);
  server_addr.sin_addr = *((struct in_addr *)host->h_addr);
  if (connect(server, (struct sockaddr *)&server_addr, sizeof server_addr) < 0) 
    {
    perror("Connect fehlgeschlagen");
    close(server);
    return 3;
    }

  /* Receive the message with recv(). */
  /* (The message was sent in the server applikation the server with send().) */
  if ((numbytes = recv(server, buf, MAXDATASIZE-1, 0)) == -1) 
    {
    perror("Empfangsfehler");
    close(server);
    return 4;
    }

  /* Null-terminate the message so we can print it as a string.  */
  buf[numbytes] = '\0';
  printf("%s",buf);
  close(server);
  return 0;
  }

