/*
 * Simple ECHO udp client
 * usage: clientechoudp host message
 * (c)2013 JBY
 */
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
#include <netdb.h>
#include <strings.h>
#include <unistd.h>

#define PORT 5678

int main(int argc,char *argv[]) {
  struct sockaddr_in addrto, addrfrom;
  int sock;
  char tampon[256];
  struct hostent *hent;

  if (argc<3) {
    fprintf(stderr,"usage: %s host message\n",argv[0]);
    exit(1);
  }
  hent = gethostbyname(argv[1]);
  if (hent==NULL) {
    fprintf(stderr,"%s: host %s unknown\n",argv[0],argv[1]);
    exit(1);
  }
  sock = socket(PF_INET,SOCK_DGRAM,0); // Protocol family
  if (sock==-1) {
    perror("socket: ");
    exit(1);
  }
  /* BEGINNING OF OPTIONAL CODE inet sockets are 'auto-bound' */
  addrfrom.sin_family = AF_INET; // Address family
  addrfrom.sin_port = htons(0);  // Any suitable port
  addrfrom.sin_addr.s_addr = htonl(INADDR_ANY); // Any address
  if (bind(sock,(struct sockaddr *)(&addrfrom),sizeof(addrfrom))==-1) {
    perror("bind: ");
    close(sock);
    exit(1);
  }
  /* END OF OPTIONAL CODE */
  addrto.sin_family = hent->h_addrtype; // destination from db
  memcpy(&(addrto.sin_addr.s_addr),hent->h_addr_list[0],hent->h_length);
  addrto.sin_port = htons(PORT);        // fixed port
  strcpy(tampon,argv[2]);
  if (sendto(sock,tampon,256,0,(struct sockaddr *)(&addrto),sizeof(addrto))==-1) {
    perror("sendto: ");
    close(sock);
    exit(1);
  }
  if (strcmp(tampon,"quit")) {
    if (recv(sock,tampon,256,0)==-1) {
      perror("recv:");
      close(sock);
      exit(1);
    }
    printf("Recu : %s\n",tampon);
  }
  close(sock);
  return 0;
}