Probleme en c

Fermé
info20111 Messages postés 3 Date d'inscription samedi 24 décembre 2011 Statut Membre Dernière intervention 11 janvier 2012 - 24 déc. 2011 à 12:27
moska Messages postés 7520 Date d'inscription dimanche 23 septembre 2007 Statut Modérateur, Contributeur sécurité Dernière intervention 26 juin 2019 - 25 déc. 2011 à 03:35
Bonjour,


je suis demandée de développer un code serveur qui:
1-crée et prépare une socket
2-attend une demande de connexion sur la socket crée
3-accepte une demande de connexion en créant une socket de communication
4-utilise la socket de communication pour lire un texte envoyé par le client
5-crée une file de message pour envoyer le texte à un processus Majp si le texte est majuscule.Dans le cas ou le texte est miniscule alors l'envoyer à un autre processus Minp.Dans le cas ou le texte ne vérifie pas ces deux conditions alors le serveur envoie une erreur de saisi au client
6-envoie la réponse reçue de l'un des deux processus Majp ou Minp vers le client via la socket de communication
voila le code du serveur que j'ai developpé:
#if defined (WIN32)
    #include <winsock2.h>
    typedef int socklen_t;
#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 <errno.h> 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#define CLE 17
#define PORT 1024
struct msgbuffer
{     long mtype;
      char mtext[256];
}msgp;
 
 
  int majuscule(char *chaine)
{ int k=0;int i;
  for( i=1;i<=(strlen(chaine)-1);i++)
     if (chaine[i]<97) k++;
  if (k==(strlen(chaine)-1)) return 1;
  else return 0;
} 
 int miniscule(char *chaine)
{ int k=0;int i;
  for( i=1;i<=(strlen(chaine)-1);i++)
     if (chaine[i]>=97) k++;
  if (k==(strlen(chaine)-1)) return 1;
  else return 0;
} 
 
int main(void)
{
    #if defined (WIN32)
        WSADATA WSAData;
        int erreur = WSAStartup(MAKEWORD(2,2), &WSAData);
    #else
        int erreur = 0;
    #endif
 
    /* Socket et contexte d'adressage du serveur */
    SOCKADDR_IN sin;
    SOCKET sock;
    socklen_t recsize = sizeof(sin);
    int BUF_SIZE=100; 
    char  buffer[BUF_SIZE];
    char *chaine="Erreur de saisie";
 
 
    /* Socket et contexte d'adressage du client */
    SOCKADDR_IN csin;
    SOCKET csock;
    int msqid, x,ms;
    socklen_t crecsize = sizeof(csin);
 
    int sock_err;
 
 
    if(!erreur)
    {
        /* Création d'une socket */
        sock = socket(AF_INET, SOCK_STREAM, 0);
 
        /* Si la socket est valide */
        if(sock != INVALID_SOCKET)
        {
            printf("La socket %d est maintenant ouverte en mode TCP/IP\n", sock);
 
            /* Configuration */
            sin.sin_addr.s_addr = htonl(INADDR_ANY);  /* Adresse IP automatique */
            sin.sin_family = AF_INET;                 /* Protocole familial (IP) */
            sin.sin_port = htons(PORT);               /* Listage du port */
            sock_err = bind(sock, (SOCKADDR*)&sin, recsize);
 
            /* Si la socket fonctionne */
            if(sock_err != SOCKET_ERROR)
            {
                /* Démarrage du listage (mode server) */
                sock_err = listen(sock, 1);
                printf("Listage du port %d...\n", PORT);
 
                /* Si la socket fonctionne */
                if(sock_err != SOCKET_ERROR)
                {
                    /* Attente pendant laquelle le client se connecte */
                    printf("Patientez pendant que le client se connecte sur le port %d...\n", PORT);
                    csock = accept(sock, (SOCKADDR*)&csin, &crecsize);
                    printf("Un client se connecte avec la socket %d de %s:%d\n", csock, inet_ntoa(csin.sin_addr), htons(csin.sin_port));
                }
                else
                    perror("listen");
            }
            else
                perror("bind");
            /* Lire le texte envoyé par le client*/
            if(recv(sock, buffer, BUF_SIZE - 1, 0) < 0)
            perror("recv()");
            /*Le serveur crée une file de message pour envoyer le texte lu à un processus Majp si le texte est miniscule.Dans le cas ou 
             le texte est miniscule alors l'envoyer à un autre processus Minp.Dans le cas ou le texte ne vérifie pas ces 
             deux conditions alors le   serveur  envoie une erreur de saisi au client*/
             if (majuscule(buffer)) 
            { 
               msqid = msgget ((key_t)CLE,0666| IPC_CREAT |IPC_EXCL);
               printf ("je viens de créer une file de message \n");
               msgp.mtype=12;
               strcpy(msgp.mtext,buffer);
               msgsnd(msqid,&msgp,strlen(buffer), 0);
               msqid = msgget ((key_t)CLE,0);
 
 
               x=msgrcv(msqid,&msgp,100,(long)12, 0);
 
 
               chaine=msgp.mtext;
               printf("Le texte en miniscule %s \n",msgp.mtext);
               msgctl(msqid,IPC_RMID,NULL);
               printf("je viens de détruire la file \n");
                   if(send(sock, chaine, strlen(chaine), 0) < 0)
                      {
                        perror("send()");
                        exit(errno);
                       }
 
             }
             else if (miniscule(buffer))
             { 
               msqid = msgget ((key_t)CLE,0666| IPC_CREAT |IPC_EXCL);
               printf ("je viens de créer une file de message \n");
               msgp.mtype=12;
               strcpy(msgp.mtext,buffer);
               msgsnd(msqid,&msgp,strlen(buffer), 0);
 
                 ms= msgget ((key_t)CLE,0);
 
 
               x=msgrcv(msqid,&msgp,100,(long)12, 0);
               chaine=msgp.mtext;
               printf("Le texte en majuscule %s \n",msgp.mtext);
               msgctl(msqid,IPC_RMID,NULL);
               printf("je viens de détruire la file \n");
                     if(send(sock, chaine, strlen(chaine), 0) < 0)
                      {
                        perror("send()");
                        exit(errno);
                       }
             }
             else  if(send(sock, chaine, strlen(chaine), 0) < 0)
                      {
                        perror("send()");
                        exit(errno);
                       }
 
            /* Fermeture de la socket client et de la socket serveur */
            printf("Fermeture de la socket client\n");
            closesocket(csock);
            printf("Fermeture de la socket serveur\n");
            closesocket(sock);
            printf("Fermeture du serveur terminée\n");
        }
        else
            perror("socket");
 
        #if defined (WIN32)
            WSACleanup();
        #endif
    }
 
    return EXIT_SUCCESS;
}

j'obtiens lors de l'éxécution:
La socket 3 est maintenant ouverte en mode TCP/IP
bind: Permission denied
recv(): Transport endpoint is not connected
je viens de créer une file de message
Le texte en miniscule 
je viens de détruire la file
pouvez vous m'aider svp?

3 réponses

rafit jad kuldinger Messages postés 7689 Date d'inscription dimanche 4 avril 2010 Statut Membre Dernière intervention 2 février 2024 1 151
24 déc. 2011 à 12:38
ou a alor tu utilise tous simplement la messagerie mail !qui fait tres bien tous cela...

^^

0
info20111 Messages postés 3 Date d'inscription samedi 24 décembre 2011 Statut Membre Dernière intervention 11 janvier 2012
24 déc. 2011 à 12:41
j'ai pas compri ce que tu veux dire :( le prof nous a demandé d'utiliser les sockets et les files de messages
0
jisisv Messages postés 3645 Date d'inscription dimanche 18 mars 2001 Statut Modérateur Dernière intervention 15 janvier 2017 934
Modifié par jisisv le 24/12/2011 à 21:53
Rafid machinchose, tu te trompes sur toute la ligne: on n'est pas là pour FAIRE les devoirs des autres.
Saisis-tu la nuance ?
D'autre part les services de messageries (SMTP et consorts) n'ont rien àvoir avec le problème.
Je suis malheureusemenr sur un portable et suis en visite. Je regaederail le problème dès mon retour.
0
rafit jad kuldinger Messages postés 7689 Date d'inscription dimanche 4 avril 2010 Statut Membre Dernière intervention 2 février 2024 1 151
25 déc. 2011 à 02:32
si tu avais bien lu tu aurai compris que mon clavier avait boufé un mot .
0
moska Messages postés 7520 Date d'inscription dimanche 23 septembre 2007 Statut Modérateur, Contributeur sécurité Dernière intervention 26 juin 2019 384
25 déc. 2011 à 03:35
Lu


@ rafit,

si tu avais bien lu tu aurai compris que mon clavier avait boufé un mot

Comme dans quasiment tout tes posts d'ailleurs... t'en as apparemment rien à faire de l'orthographe depuis le temps. Cela t'as été signifié à maintes reprises...
Merci de bien vouloir tenir compte des mails de notification reçus dans ta boite mail.

@+
0