/* udp/cli/main.c

Client UDP basique

*/

#if defined (WIN32)
#include <winsock2.h>
#elif defined (linux)
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#define INVALID_SOCKET -1
#define SOCKET_ERROR -1
#define closesocket(s) close (s)
typedef int SOCKET;
typedef struct sockaddr_in SOCKADDR_IN;
typedef struct sockaddr SOCKADDR;
#endif

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define PORT 23

#define IP "127.0.0.1"

int client (void)
{
   /* Creation de la socket sur le domaine internet */
   SOCKET sock = socket (AF_INET, SOCK_DGRAM, IPPROTO_UDP);
   if (sock != INVALID_SOCKET)
   {
      struct sockaddr_in si_client = { 0 };

      /* Initialisation de la structure contenant l'adresse de
         l'hote et le port utilise */
      si_client.sin_family = AF_INET;

      /* conversion du numero de port */
      si_client.sin_port = htons (PORT);

      /* conversion de l'adresse ip */
      si_client.sin_addr.s_addr = inet_addr (IP);

      printf ("bound to %s:%d\n", IP, PORT);

      /* Envoi du message */
      const char *message = "Salut !";
      int nb_octet = sendto (sock, message, strlen (message), 0,
                             (struct sockaddr *) &si_client,
                             sizeof (si_client));

      if (nb_octet > 0)
      {
         printf ("%d octets sent\n", nb_octet);

         {
            char data[128];
            int size_info_socket = sizeof (si_client);
            int nb_octet = recvfrom (sock, data, sizeof data - 1, 0,
                                     (struct sockaddr *) &si_client,
                                     &size_info_socket);

            if (nb_octet > 0)
            {
               printf ("%d octets received\n", nb_octet);
               data[nb_octet] = 0;
               printf ("< '%s'\n", data);
            }
            else if (nb_octet < 0)
            {
               printf ("recvfrom() : local error\n");
            }
            else
            {
               printf ("recvfrom() : remote error\n");
            }
         }
      }
      else if (nb_octet < 0)
      {
         printf ("sendto() : local error\n");
      }
      else
      {
         printf ("sendto() : remote error\n");
      }

      /* Fermeture de la socket */
      (void) closesocket (sock);
   }
   else
   {
      printf ("socket() error\n");
   }

   return 0;
}

int main (void)
{
#if defined (WIN32)
   WSADATA WSAData;
   int erreur = WSAStartup (MAKEWORD (2, 0), &WSAData);
#else
   int erreur = 0;
#endif
   client ();
#if defined (WIN32)
   WSACleanup ();
#endif
   system ("pause");

   return 0;
}
