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

#define DATA "The sea is calm tonight, the tide is full . . ."

/*
* Here I send a datagram to a receiver whose name I get from the command
* line arguments. The form of  the command line is dgramsend hostname
* portnumber
*/


int main(int argc, char *argv[])
{
  int sock;
  struct sockaddr_in name;
  struct hostent *hp;
  
  if (argc < 3) {
    fprintf(stderr,"Usage: inetdgram_c <host> <port#>\n");
    exit(0);
  }

  /* Create socket on which to send. */
  sock = socket(AF_INET, SOCK_DGRAM, 0);
  if (sock < 0) {
    perror("opening datagram socket");
    exit(1);
  }

  /*
   * Construct name, with no wildcards, of the socket to send to.
   * Gethostbyname() returns a structure including the network address
   * of the specified host. The port number is taken from the command
   * line.
   */
  hp = gethostbyname(argv[1]);
  if (hp == NULL) {
    fprintf(stderr, "%s: unknown host", argv[1]);
    exit(2);
  }
  memcpy(hp->h_addr, &name.sin_addr, hp->h_length);
  name.sin_family = AF_INET;
  name.sin_port = htons(atoi(argv[2]));

  /* Send message. */
  if (sendto(sock, DATA, sizeof(DATA), 0, (struct sockaddr *)&name, sizeof(name)) < 0)
    perror("sending datagram message");
  close(sock);
}
