#include <sys/types.h> /* Types prédéfinis "c" */
#include <sys/socket.h> /* Généralités sockets */
#include <sys/param.h> /* Paramètres et limites système */
#include <netinet/in.h> /* Spécifications socket internet */
#include <stdio.h> /* I/O fichiers classiques */
#include <string.h> /* Gestion chaines de caractères */
#include <netdb.h> /* Gestion network database */
#include <errno.h> /* Erreurs système */
#define SERVEUR_DEFAULT ("localhost" ) /* Nom serveur utilisé par défaut */
#define SERVICE_LABEL ("essai" ) /* Nom service requis */
#define SERVICE_PROTOCOL ("tcp" ) /* Protocole service requis */
#define SZ_BUF (256) /* Taille buffer */
int main(
int argc, /* Nbre arg. */
char *argv[]) /* Ptr arguments */
{
/* Déclaration des variables */
ushort i; /* Indice de boucle */
ushort j; /* Indice de boucle */
int sk_connect; /* Socket de connection */
int sk_dialog; /* Socket de dialogue */
char buf[SZ_BUF]; /* Buffer texte */
char hostname[MAXHOSTNAMELEN + 1]; /* Nom machine locale */
char *serveur; /* Ptr vers le nom du serveur */
char *pt; /* Ptr vers un caractère qcq. */
struct sockaddr_in adr_serveur; /* Adresse socket serveur */
struct hostent *host_info; /* Info. host */
struct servent *service_info; /* Info. service demandé */
/* Remplissage du nom du serveur */
if (argc > 1)
/* Le nom du serveur est l'argument n° 1 */
serveur=argv[1];
else
/* Le nom du serveur est pris par défaut */
serveur=SERVEUR_DEFAULT;
/* Récuperation nom machine locale (juste pour l'exemple) */
if (gethostname(hostname, MAXHOSTNAMELEN) != 0)
{
fprintf(stderr, "ligne %u - gethostname(%s) - %s\n", __LINE__, hostname, strerror(errno));
exit(errno);
}
printf("gethostname='%s'\n", hostname);
/* Récuperation informations serveur */
if ((host_info=gethostbyname(serveur)) == NULL)
{
fprintf(stderr, "ligne %u - gethostbyname(%s) - %s\n", __LINE__, serveur, strerror(errno));
exit(errno);
}
fputc('\n', stdout);
printf("host_info.h_name='%s'\n", host_info->h_name);
for (i=0; host_info->h_aliases[i] != NULL; i++)
printf("host_info.h_aliase[%hu]='%s'\n", i, host_info->h_aliases[i]);
printf("host_info.h_addrtype=%u\n", host_info->h_addrtype);
printf("host_info.h_length=%u\n", host_info->h_length);
for (i=0; host_info->h_addr_list[i] != NULL; i++)
{
printf("host_info.h_addr_list[%hu]=", i);
for (j=0; j < host_info->h_length; j++)
printf("%hu ", (unsigned char)host_info->h_addr_list[i][j]);
fputc('\n', stdout);
}
/* Récuperation port dans "/etc/services" */
if ((service_info=getservbyname(SERVICE_LABEL, SERVICE_PROTOCOL)) ==NULL)
{
fprintf(stderr, "ligne %u - getservbyname(%s, %s) - %s\n", __LINE__, SERVICE_LABEL, SERVICE_PROTOCOL, strerror(errno));
exit(errno);
}
fputc('\n', stdout);
printf("service_name='%s'\n", service_info->s_name);
for (i=0; service_info->s_aliases[i] != NULL; i++)
printf("service_s_aliase[%hu]='%s'\n", i, service_info->s_aliases[i]);
printf("service_port=%hu\n", ntohs(service_info->s_port));
printf("service_protocole='%s'\n", service_info->s_proto);
/* Remplissage adresse socket */
memset(&adr_serveur, 0, sizeof(struct sockaddr_in));
adr_serveur.sin_len=host_info->h_length;
adr_serveur.sin_family=AF_INET;
adr_serveur.sin_port=service_info->s_port;
memcpy(&adr_serveur.sin_addr.s_addr, host_info->h_addr, host_info->h_length);
/* Tentative de connection en boucle permanente */
fputc('\n', stdout);
do {
/* Création socket */
if ((sk_dialog=socket(AF_INET, SOCK_STREAM, 0)) == (-1))
{
fprintf(stderr, "ligne %u - socket() - %s\n", __LINE__, strerror(errno));
exit(errno);
}
/* Connection au serveur */
if ((sk_connect=connect(sk_dialog, &adr_serveur, sizeof(struct sockaddr_in))) == (-1))
{
fprintf(stderr, "ligne %u - connect() - %s\n", __LINE__, strerror(errno));
sleep(5);
}
} while (sk_connect == (-1));
printf("Connection réussie\n" );
/* Saisie et envoi de la chaîne en boucle */
do {
/* Saisie de la chaîne */
fputs("Entrer chaine (EOT pour finir) :", stdout); fflush(stdout);
fgets(buf, SZ_BUF, stdin);
/* Suppression de la chaîne saisie du caractère '\n' s'il y est */
if ((pt=strchr(buf, '\n')) != NULL)
*pt='\0';
/* Envoi de la chaîne sur la socket */
if (write(sk_dialog, buf, strlen(buf) + 1) == (-1))
fprintf(stderr, "ligne %u - write(%s) - %s\n", __LINE__, buf, strerror(errno));
} while (strcmp(buf, "EOT" ) != 0);
/* Fermeture socket et fin du programme */
close(sk_dialog);
return(0);
} |