Programmation Avancée en C


socket_Unix1_client.c

00001 #include <stdio.h> 
00002 #include <stdlib.h> 
00003 #include <unistd.h>
00004 #include <sys/types.h>
00005 #include <sys/socket.h>
00006 #include <netinet/in.h>
00007 #include <arpa/inet.h>
00008 #include <netdb.h> 
00009 #include <string.h>
00010 #define __USE_MISC 1
00011 #include <sys/un.h>    
00012 
00013 #define TAILLE_MAX 256
00014 
00015 void error(char * msg);      // cf. ligne /*@\ref{network::socket_TCP_client::error} du listing~\ref{network::socket_TCP_client}@*/
00016 void doit(int desc_sock, struct sockaddr_un * serv); // cf.
00017 
00018 // [...]
00019 #define CHEMIN_SERVEUR "/tmp/server.socket"  // Chemin de la socket serveur.
00020 
00021 int main(int argc, char* argv[])
00022 {
00023         char * chem_svr = CHEMIN_SERVEUR;
00024         struct sockaddr_un adr_svr;
00025 
00026         switch (argc) { // Traitement des arguments de la ligne de commande.
00027         case 2:  chem_svr = argv[1];
00028         case 1:  break;
00029         default: fprintf(stderr, "Usage: %s [server_path]\n",argv[0]);
00030                 return EXIT_FAILURE;
00031         }
00032 
00033         /*** Construction de l'adresse du serveur. ***/
00034         memset(&adr_svr, 0, sizeof(adr_svr)); // Remplissage à 0.
00035 #ifndef __GLIBC__   /* La glibc ne définit pas le champ sun_len. */
00036         adr_svr.sun_len    = sizeof(adr_svr);
00037 #endif
00038         adr_svr.sun_family = AF_LOCAL;
00039         strncpy(adr_svr.sun_path, chem_svr, sizeof(adr_svr.sun_path)-1);
00040         adr_svr.sun_path[sizeof adr_svr.sun_path  - 1] = 0;
00041 
00042         /*** Création de la socket. ***/
00043         int desc_sock = socket(AF_LOCAL,SOCK_STREAM,0);
00044         if (desc_sock == -1)   error("[socket]");
00045 
00046         /*** Connexion au serveur. ***/
00047         if (connect(desc_sock, (struct sockaddr *) &adr_svr, SUN_LEN(&adr_svr)))
00048                 error("[connect]");
00049         doit(desc_sock, &adr_svr);
00050 
00051         /*** Fermeture de la socket. ***/
00052         close(desc_sock);
00053         return EXIT_SUCCESS;
00054 }
00055 
00056 /*** Gestion des interactions avec le serveur ***/
00057 void doit(int desc_sock, struct sockaddr_un * serv)
00058 {
00059         char requete[TAILLE_MAX] = "Luc, je suis ton père!";
00060         char reponse[TAILLE_MAX+1];
00061         size_t request_size = strlen(requete) + 1;
00062 
00063         ssize_t n = send(desc_sock, requete, request_size, 0); // Envoi de la requête.
00064         if (n != request_size) error("[send]");
00065         printf("Requête envoyée à %s : <%s> (%ld octets)\n", serv->sun_path, requete, (long) n);
00066 
00067         n = recv(desc_sock, reponse, TAILLE_MAX-1, 0); // La réponse du serveur.
00068         if (n < 0) error("[recv]");
00069         reponse[TAILLE_MAX] = '\0'; // Précaution pour l'affichage.
00070         printf("Réponse obtenue: <%s> (%ld octets)\n", reponse, (long) n);
00071 }
00072 
00073 void error(char * msg)
00074 {
00075         perror(msg);
00076         exit(EXIT_FAILURE);
00077 }
00078 
00079 /*
00080   char requete[TAILLE_MAX] = "Luc, je suis ton père!";
00081   ssize_t numoctet_env = send(desc_sock, requete, strlen(requete)+1, 0);
00082   if (numoctet_env < 0) error("[send]");
00083   
00084   printf("Requête envoyée à %s: <%s> (%lu octets)\n",
00085   adr_svr.sun_path, requete, numoctet_env);
00086   
00087   char reponse[TAILLE_MAX];
00088   ssize_t numoctet_recu = recv(desc_sock, reponse, TAILLE_MAX, 0);
00089   if (numoctet_recu < 0) error("[recv]");
00090   printf("Réponse obtenue: <%s> (%lu octets)\n",reponse, numoctet_recu);
00091 */